  559

}
reader_thread()

{

lock_?or_read (block) ;

pthread_cleanup_push (release_read_lock, &lock) ;

/*

*     .

*/

pthread_cleanup_pop (1) ;

}

writer_thread()
{

lock_for_write (&lock) ;

pthread_cleanup_push (release_write_lock, &lock) ;

/*

*     .

*/

pthread_cleanup_pop (1) ;

}

  

   , pthread_cleanup_push ()  pthread_clea-
nup_pop (),          
,        .    -
 " ".

 

,     , pthread_cleanup_push()
Hpthread_cleanup_pop(),       
   ,    ,     
       ,   
 (  )    . 
         .

ttdefine pthread_cleanup_push (rtn, arg) { \

struct _pthread_handler_rec _cleanup_handler, **_head; \

_cleanup_handler.rtn = rtn; \

_cleanup_handler.arg = arg; \
(void) pthread_getspecific (_pthread_handler_key, &_head) ;

\

_cleanup_handler.next = *_head; \

*_head = &_cleanup_handler;

#define pthread_cleanup_pop (ex) \

*_head = _cleanup_handler.next; \

if (ex) (*_cleanup_handler.rtn) (_cleanup_handler.arg); \
}

   ""   ,   -
 ""     ,   