壮心未与年俱老,死去犹能作鬼雄。这篇文章主要讲述LinuxLinux 条件变量 为什么要配合互斥锁相关的知识,希望能为你提供帮助。
官方:
A condition variable must always be associated with a mutex,toavoid网友:
the race condition where a thread prepares to wait on a condition vari‐
able and another thread signals the conditionjustbeforethefirst
thread actually waits on it.
【LinuxLinux 条件变量 为什么要配合互斥锁】条件变量必须始终与互斥锁配合,以避免竞争状态:其中线程准备等待一个条件,另一个线程刚好在第一个线程 真正等待 之前发出条件信号。
pthread_cond_wait总和一个互斥锁结合使用。在调用pthread_cond_wait前要先获取锁。pthread_cond_wait函数执行时先自动释放指定的锁,然后等待条件变量的变化。
来看一个例子(你是否能理解呢?):
In Thread1:
pthread_mutex_lock(& m_mutex);
pthread_cond_wait(& m_cond,& m_mutex);
pthread_mutex_unlock(& m_mutex);
In Thread2:
pthread_mutex_lock(& m_mutex);
pthread_cond_signal(& m_cond);
pthread_mutex_unlock(& m_mutex);
为什么要与pthread_mutex 一起使用呢? 这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。
加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 释放锁并进入wait_cond状态 ,此时线程2上锁) 的时候才能调用cond_singal.
??http://blog.chinaunix.net/uid-27164517-id-3282242.html??
我的理解:
为了将条件判断和wait变成一个原子操作。
void function_2() {
int data = https://www.songbingjia.com/android/0;
while ( data != 1) {
std::unique_lock< std::mutex> locker(mu);
while(q.empty())
cond.wait(locker); // Unlock mu and wait to be notified
data = https://www.songbingjia.com/android/q.back();
q.pop_back();
locker.unlock();
std::cout < < "t2 got a value from t1: " < < data < < std::endl;
}
}
while(q.empty())
cond.wait(locker); // Unlock mu and wait to be notified
如果不加锁,在线程2判断q.empty()后(如果为true),然后跳过这一步准备下一步cond.wait, 如果此时线程1修改q,然后发出notify,结果因为线程2还没进入cond.wait,这个notify就被线程2给错过了,然后线程2完成进入cond.wait,只能等下一个notify了,如果没有下一个notify或者下一个notify依赖于线程2,那就一直卡在那里。
而如果加了锁,那判断q.empty()和cond.wait就变成一个原子操作,线程2在完成cond.wait之前,线程1是改不了q的。
?
推荐阅读
- Linuxerror while loading shared libraries: libevent-2.1.so.6 的解决办法|动态库.so找不到的解决办法
- 彦思科技(低成本快部署船运物流管理系统,为航运企业降本增效)
- powershell 常用命令
- LinuxCPU频率控制|Conflicting CPU frequency values detected使用cpupower设置CPU Performance模式
- Linux查询安装包|软件包依赖和被依赖关系|yum|rpm
- Linux系统下的文件操作
- linux查看文件大小
- 操作系统解决kali安装dsniff失败
- Gitlab-ee使用以及git基础命令