web服务器开发日记---线程条件变量pthread_cond_t

转自https://blog.csdn.net/icechenbing/article/details/7662026

①:

#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr);
返回值:函数成功返回0;任何其他返回值都表示错误

初始化一个条件变量。当参数为空指针时,函数创建的是一个缺省的条件变量;否则条件变量的属性将由cattr中的属性来决定。函数返回时,条件变量被存放在参数cv指向的内存中。

不能由多个线程同时初始化一个条件变量。当需要重新初始化或释放一个条件变量时,应用程序必须保证这个条件变量未被使用。

②:

#include <pthread.h>
int 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函数,并把满足条件的表达式置为循环的终止条件。

③:

#include <pthread.h>
int pthread_cond_signal(pthread_cond_t *cv);
返回值:函数成功返回0;任何其他返回值都表示错误

用来释放被阻塞在指定条件变量上的一个线程。

④:

#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函数。

转自https://blog.csdn.net/special00/article/details/52279564

⑤:pthread_cond_wait和pthread_cond_singal是怎样配对使用的:

pthread_cond_wait动作分解:

1.将线程放在等待队列上,解锁

2.等待pthread_cond_signal或者pthread_cond_broadcast信号之后去竞争锁

3.若竞争到互斥锁则加锁。

等待线程:

pthread_cond_wait前要先加锁

pthread_cond_wait内部会解锁,然后等待条件变量被其他线程激活

pthread_cond_wait被激活后会再自动加锁

激活线程:

加锁(和等待线程用同一个锁)

pthread_cond_signal发送信号(阶跃信号前最好判断有无等待线程)

解锁

猜你喜欢

转载自blog.csdn.net/weixin_42634329/article/details/81071656
今日推荐