本文共 2500 字,大约阅读时间需要 8 分钟。
1.pthread_cond_init
返回值:函数成功返回0;任何其他返回值都表示错误;不能由多个线程同时初始化一个条件变量。当需要重新初始化或释放一个条件变量时,应用程序必须保证这个条件变量未被使用。2.pthread_cond_waitint pthread_cond_wait(pthread_cond_t cv,pthread_mutex_t mutex);返回值:函数成功返回0;任何其他返回值都表示错误;函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上;被阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可以重新检查条件值,也可以被信号中断后唤醒
pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。
pthread_cond_wait函数返回时,相应的互斥锁将被当前线程锁定,即使是函数出错返回。
阻塞在条件变量上的线程被唤醒以后,直到pthread_cond_wait()函数返回之前条件的值都有可能发生变化。所以函数返回以后,在锁定相应的互斥锁之前,必须重新测试条件值。最好的测试方法是循环调用pthread_cond_wait函数,并把满足条件的表达式置为循环的终止条件。如:
pthread_mutex_lock();
while (condition_is_false)pthread_cond_wait();pthread_mutex_unlock();阻塞在同一个条件变量上的不同线程被释放的次序是不一定的。注意:pthread_cond_wait()函数是退出点,如果在调用这个函数时,已有一个挂起的退出请求,且线程允许退出,这个线程将被终止并开始执行善后处理函数,而这时和条件变量相关的互斥锁仍将处在锁定状态。
4.阻塞直到指定时间pthread_cond_timedwait
#include <pthread.h>#include <time.h>int pthread_cond_timedwait(pthread_cond_t cv,pthread_mutex_t mp, const structtimespec * abstime);返回值:函数成功返回0;任何其他返回值都表示错误函数到了一定的时间,即使条件未发生也会解除阻塞。这个时间由参数abstime指定。函数返回时,相应的互斥锁往往是锁定的,即使是函数出错返回。注意:pthread_cond_timedwait函数也是退出点。
超时时间参数是指一天中的某个时刻。使用举例:
pthread_timestruc_t to;
to.tv_sec = time(NULL) + TIMEOUT;to.tv_nsec = 0;超时返回的错误码是ETIMEDOUT。5.释放阻塞的所有线程pthread_cond_broadcast
#include <pthread.h>int pthread_cond_broadcast(pthread_cond_t *cv);返回值:函数成功返回0;任何其他返回值都表示错误函数唤醒所有被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cv被用来指定这个条件变量。当没有线程阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。由于pthread_cond_broadcast函数唤醒所有阻塞在某个条件变量上的线程,这些线程被唤醒后将再次竞争相应的互斥锁,所以必须小心使用pthread_cond_broadcast函数。
6.释放条件变量pthread_cond_destroy
#include <pthread.h>int pthread_cond_destroy(pthread_cond_t *cv);返回值:函数成功返回0;任何其他返回值都表示错误释放条件变量。注意:条件变量占用的空间并未被释放。
线程同步
同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃处理器。当多个线程协作时,相互作用的任务必须在一定的条件下同步。
Linux下的C语言编程有多种线程同步机制,最典型的是条件变量(condition variable)。pthread_cond_init用来创建一个条件变量,其函数原型为:
pthread_cond_init (pthread_cond_t cond, const pthread_condattr_t attr);
pthread_cond_wait和pthread_cond_timedwait用来等待条件变量被设置,值得注意的是这两个等待调用需要一个已经上锁的互斥体mutex,这是为了防止在真正进入等待状态之前别的线程有可能设置该条件变量而产生竞争。pthread_cond_wait的函数原型为:
pthread_cond_wait (pthread_cond_t cond, pthread_mutex_t mutex);
pthread_cond_broadcast用于设置条件变量,即使得事件发生,这样等待该事件的线程将不再阻塞:
pthread_cond_broadcast (pthread_cond_t *cond) ;
pthread_cond_signal则用于解除某一个等待线程的阻塞状态:
pthread_cond_signal (pthread_cond_t *cond) ;
pthread_cond_destroy 则用于释放一个条件变量的资源。
在头文件semaphore.h 中定义的信号量则完成了互斥体和条件变量的封装,按照多线程程序设计中访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。
转载于:https://blog.51cto.com/4937417/2362784