同步——读写锁

来源:互联网 发布:收据打印软件 注册码 编辑:程序博客网 时间:2024/04/30 02:47

读写锁,又称为共享-独占锁,其类型为pthread_rwlock_t ,静态初始化通过赋值PTHREAD_RWLOCK_INITIALIZER

#include <pthread.h>int pthread_rwlock_init(pthread_rwlock_t *rwptr, const pthread_rwlockattr_t *attr); // return 0/errnoint pthread_rwlock_destroy(pthread_rwlock_t *rwptr); // return 0/errnoint pthread_rwlock_rdlock(pthread_rwlock_t *rwptr); // return 0/errno, if written, blockedint pthread_rwlock_wrlock(pthread_rwlock_t *rwptr); // return 0/errno, if read, blockedint pthread_rwlock_unlock(pthread_rwlock_t *rwptr); // return 0/errnoint pthread_rwlock_tryrdlock(pthread_rwlock_t *rwptr); // return 0/errno, if written, return EBUSYint pthread_rwlock_trywrlock(pthread_rwlock_t *rwptr); // return 0/errno, if read, return EBUSYint pthread_rwlockattr_init(pthread_rwlockattr_t *attr); // return 0/errnoint pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); // return 0/errnoint pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *valptr); // return 0/errnoint pthread_rwlockattr_getpshared(pthread_rwlockattr_t *attr, int *valptr); // return 0/errno/**valptr = PTHREAD_PROCESS_PRIVATE/PTHREAD_PROCESS_SHARED, as one value-result*/
  如果pthread_cond_wait调用阻塞,随后被取消,该线程就在持有互斥锁的情况下终止,为处理被取消的可能情况,任何线程可以安装删除清理处理程序

void pthread_cleanup_push(void (*function)(void *), void *arg);void pthread_cleanup_pop(int execute);

这些处理程序就是发生在调用线程被取消或自愿终止的情况下,push的function参数是调用线程被取消时所调用的函数的地址,arg为参数;pop总是删除栈顶的函数,而且若execute不为0,那就调用该函数。

void cancelwait(void* arg){       pthread_mutex_t * m = arg;       pthread_mutex_unlock(m);}// segment{       pthread_cleanup_push(cancelwait,(void*)pMutex);       pthread_cond_wait(pCond, pMutex);       pthread_cleanup_pop(0);}

读写锁是在单个进程内的线程间共享时,变量在那个进程中;当读写锁在共享某个内存区的进程间共享时,它要指定PTHREAD_PROCESS_SHARED属性,且该变量应该在共享内存区中。