【发布时间】:2022-01-13 03:52:06
【问题描述】:
我是线程新手 我想使用 ptherad_cond_signal 和 pthread_cond_wait 检查一些情况 我有这个代码作为示例:
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int x = 0;
void* f1(void *arg){
for (int i = 0; i < 10; i++)
{
pthread_mutex_lock(&lock);
x += 10;
printf("%d\n", x);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
}
return NULL;
}
void* f2(void* arg){
pthread_mutex_lock(&lock);
while (x < 40)
{
pthread_cond_wait(&cond, &lock);
}
x -= 40;
pthread_mutex_unlock(&lock);
return NULL;
}
int main(int argc, char *args[]){
pthread_t p1, p2;
pthread_create(&p2, NULL, f2, NULL);
pthread_create(&p1, NULL, f1, NULL);
pthread_exit(NULL);
return 0;
}
结果:
10
20
30
40
50
60
70
80
90
100
但我希望:
10
20
30
40
10
20
30
40
50
60
为什么在 pthread_cond_signal 之后,函数 f2 不继续?
似乎在 f1 for 循环中,在 pthread_cond_wait 唤醒之前再次锁定
【问题讨论】:
-
stackoverflow.com/q/14947191/2864740 - pthread_mutex_lock 不能保证是公平的,创建的顺序也不能保证调度。无论如何,在 f1 解锁后睡一秒钟以获得不同的行为(仍然不正确,但它应该显示原因..)。
-
@user2864740 - 添加睡眠语句以使多线程代码具有预期的行为是一种糟糕的传播模式。它大部分都可以工作,但是在一个复杂的系统上,一个线程“等待足够长的时间”保证另一个线程已经完成它的工作是错误的假设。它打败了条件变量的全部意义。这会导致奇怪的错误。
-
@user2864740 - 感谢您的澄清。
标签: c multithreading pthreads mutex condition-variable