读写锁,又称为共享-独占锁,其类型为pthread_rwlock_t ,静态初始化通过赋值PTHREAD_RWLOCK_INITIALIZER
#include <pthread.h> int pthread_rwlock_init(pthread_rwlock_t *rwptr, const pthread_rwlockattr_t *attr); // return 0/errno int pthread_rwlock_destroy(pthread_rwlock_t *rwptr); // return 0/errno int pthread_rwlock_rdlock(pthread_rwlock_t *rwptr); // return 0/errno, if written, blocked int pthread_rwlock_wrlock(pthread_rwlock_t *rwptr); // return 0/errno, if read, blocked int pthread_rwlock_unlock(pthread_rwlock_t *rwptr); // return 0/errno int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwptr); // return 0/errno, if written, return EBUSY int pthread_rwlock_trywrlock(pthread_rwlock_t *rwptr); // return 0/errno, if read, return EBUSY int pthread_rwlockattr_init(pthread_rwlockattr_t *attr); // return 0/errno int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); // return 0/errno int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *valptr); // return 0/errno int 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属性,且该变量应该在共享内存区中。