互斥锁操作函数
初始化锁
函数原型:
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrist attr);
函数参数:
① mutex:互斥锁
② attr:互斥锁的属性(NULL为默认属性)。默认属性为快速互斥锁
快速互斥锁:如果临界区已经被一个线程获取,其他线程或者该线程再次获取时,调用线程直接被挂起。
递归互斥锁:已经获取临界区的线程可以多次获取,互斥量对象内部应有获取次数计数。如果要完全释放临界区,一定要保证获取次数和释放次数一致。
函数返回值:
成功返回:0
失败返回:出错码
获得互斥锁(上锁)
函数原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
函数参数:
① mutex:互斥锁。
函数返回值:
成功返回:0
失败返回:出错码
释放互斥锁(解锁)
函数原型:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
函数参数:
① mutex:互斥锁。
函数返回值:
成功返回:0
失败返回:出错码
销毁互斥锁
函数原型:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
函数参数:
① mutex:互斥锁。
函数返回值:
成功返回:0
失败返回:出错码
条件变量操作函数
初始化条件变量
函数原型:
int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr);
函数参数:
① cv:条件变量
② cattr:条件变量的属性(NULL为默认属性),可以设置为进程内可用(默认)或是进程间可用。
函数返回值:
成功返回:0
失败返回:出错码
阻塞在条件变量上
函数原型:
int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex);
函数参数:
① cv:条件变量
② mutex:要解开的互斥锁
函数说明:调用这个函数时,线程解开mutex指向的锁并被条件变量cv阻塞。
线程可以被函数pthread_cond_signal和函数 pthread_cond_broadcast唤醒,也可能在被信号中断后被唤醒。
线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,等待被下一次唤醒。这个过程一般用while语句实现。
函数返回值:
成功返回:0
失败返回:出错码
解除在条件变量上的阻塞
函数原型:
int pthread_cond_signal(pthread_cond_t *cv);
函数参数:
① cv:条件变量
函数说明:函数被用来释放被阻塞在指定条件变量上的一个线程。
必须在互斥锁的保护下使用相应的条件变量。否则对条件变量的解锁有可能发生在锁定条件变量之前,从而造成死锁。
如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。
函数返回值:
成功返回:0
失败返回:出错码
阻塞直到指定时间
函数原型:
int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const structtimespec * abstime);
函数参数:
① cv:条件变量
② mutex:要解开的互斥锁
③ abstime:时间参数
函数说明:函数到了一定的时间,即使条件未发生也会解除阻塞。这个时间由参数abstime指定。函数返回时,相应的互斥锁往往是锁定的,即使是函数出错返回。
注意:pthread_cond_timedwait函数也是退出点。
函数返回值:
成功返回:0
失败返回:出错码
超时返回的错误码是ETIMEDOUT
释放阻塞的所有线程
函数原型:
int pthread_cond_broadcast(pthread_cond_t *cv);
函数参数:
① cv:条件变量
函数说明:函数唤醒所有被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cv被用来指定这个条件变量。当没有线程阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。
注意:由于pthread_cond_broadcast函数唤醒所有阻塞在某个条件变量上的线程,这些线程被唤醒后将再次竞争相应的互斥锁,所以必须小心使用pthread_cond_broadcast函数。
函数返回值:
成功返回:0
失败返回:出错码
释放条件变量
函数原型:
int pthread_cond_destroy(pthread_cond_t *cv);
函数参数:
① cv:条件变量
注意:条件变量占用的空间并未被释放。
函数返回值:
成功返回:0
失败返回:出错码