作者worcdlo ()
看板C_and_CPP
标题[问题] pthread_cond_broadcast 後续执行顺序
时间Wed Jun 23 17:23:23 2021
开发平台(Platform): Linux
编译器 GCC
额外使用到的函数库(Library Used): pthread
问题(Question):
今天刚好在研究critical section以及pthread的CV,他必须搭配mutex lock才能运作。
我看网路的文章,都说当thread进到pthread_cond_wait()时,
会先卡在这里并释放lock,可以透过其他thread呼叫signal或是broadcast再度唤醒。
同时也有人提到signal是保证不少於一个blocked cond被唤醒,所以建议把if变成while。
这边我困惑的点在於:
如下面程式,假设t1~t4现在都执行到wait阶段,若t5呼叫了signal或是broadcast,
导致t1~t4都收到了讯号,当t5释放lock後,是t1~t4都直接自由吗?
还是说此时只会有一个thread自由 (抢到lock?),直到lock再度被释放?
程式码(Code):
x = 0;
y = 0;
// t1, t2, t3, t4
consumer(){
pthread_mutex_lock(&mut);
while (x <= y) {
pthread_cond_wait(&cond, &mut);
}
y++;
/* operate on x and y */
pthread_mutex_unlock(&mut);
}
// t5
producer(){
pthread_mutex_lock(&mut);
/* modify x and y */
x += 2;
if (x > y) {
// pthread_cond_signal(&cond);
pthread_cond_broadcast(&cond);
}
pthread_mutex_unlock(&mut);
}
另外想请教一下,OS问题跟程式设计类的问题,能在这版问吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.176.57.68 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1624440205.A.EB2.html
1F:→ F04E: mutex同时间只能被一个执行绪拥有, 先後顺序不保证 06/23 18:19
2F:→ worcdlo: 所以wait呼叫後应该是类似condition+lock的感觉? 06/23 18:43
3F:推 dces4212: 也可以发八卦板钓jserv回答 06/23 19:11
4F:→ F04E: 你原文里不就写了cond_wait会释放... 06/23 20:15
5F:→ worcdlo: 我回文的意思是释放之後,除了要等待cond,也要等待lock 06/23 20:32
6F:推 dces4212: 相关manpage可以参考一下,最有权威的文件。所有执行绪 06/24 02:12
7F:→ dces4212: 都会被叫醒(如果已经开始等待),但醒来後大家会竞争对 06/24 02:12
8F:→ dces4212: 应lock,只有抢赢的执行绪可以离开wait。关於你的留言 06/24 02:12
9F:→ dces4212: ,没错,wait里面确实会再次尝试抢lock。 06/24 02:12