解释为什么 C 中的条件变量不能正常工作
Explanation why conditional variable in C does not work correctly
我想在 C 中使用条件变量编写一个简单的多线程程序。
我想让主线程(线程 A)休眠 5 秒,然后唤醒等待的客户端(therads B,可能有很多)打印一条消息。这应该一直重复。
我已经阅读了手册,但我不明白为什么这不起作用。
假设我通过指针将这些变量提供给所有线程(正确地,我已经检查过了):
pthread_mutex_t* mutex;
pthread_cond_t* cond;
int* variable;
我有以下代码:
线程 A(休眠):
while(1)
{
lockMutex(mutex);
(*variable) = 1;
pthread_cond_broadcast(cond);
unlockMutex(mutex);
sleep(5);
lockMutex(mutex);
(*variable) = 0;
pthread_cond_broadcast(cond);
unlockMutex(mutex);
}
线程 B(打印):
while(1)
{
lockMutex(mutex);
while((*variable) == 1)
pthread_cond_wait(cond, mutex);
unlockMutex(mutex);
fprintf("Active thread! Number: %d\n", id);
lockMutex(mutex);
while((*(variable))==0)
pthread_cond_wait(cond, mutex);
unlockMutex(mutex);
}
我没有死锁,但不幸的是,这并没有像我预期的那样工作。有人可以给我解释我该怎么办吗?如有任何帮助,我将不胜感激。
可能的问题是线程 A 在任何睡眠线程有机会看到它之前立即设置 *variable = 1
为 0
。仅仅因为条件变量将唤醒等待的线程并不意味着这些唤醒的线程将得到足够快的调度以防止线程 A 再次写入 *variable
。
我想在 C 中使用条件变量编写一个简单的多线程程序。
我想让主线程(线程 A)休眠 5 秒,然后唤醒等待的客户端(therads B,可能有很多)打印一条消息。这应该一直重复。
我已经阅读了手册,但我不明白为什么这不起作用。 假设我通过指针将这些变量提供给所有线程(正确地,我已经检查过了):
pthread_mutex_t* mutex;
pthread_cond_t* cond;
int* variable;
我有以下代码:
线程 A(休眠):
while(1)
{
lockMutex(mutex);
(*variable) = 1;
pthread_cond_broadcast(cond);
unlockMutex(mutex);
sleep(5);
lockMutex(mutex);
(*variable) = 0;
pthread_cond_broadcast(cond);
unlockMutex(mutex);
}
线程 B(打印):
while(1)
{
lockMutex(mutex);
while((*variable) == 1)
pthread_cond_wait(cond, mutex);
unlockMutex(mutex);
fprintf("Active thread! Number: %d\n", id);
lockMutex(mutex);
while((*(variable))==0)
pthread_cond_wait(cond, mutex);
unlockMutex(mutex);
}
我没有死锁,但不幸的是,这并没有像我预期的那样工作。有人可以给我解释我该怎么办吗?如有任何帮助,我将不胜感激。
可能的问题是线程 A 在任何睡眠线程有机会看到它之前立即设置 *variable = 1
为 0
。仅仅因为条件变量将唤醒等待的线程并不意味着这些唤醒的线程将得到足够快的调度以防止线程 A 再次写入 *variable
。