我想编写一个简单的多线程程序,在C中使用条件变量。
我希望主线程(线程A)能够休眠5秒,然后唤醒打印消息的等待客户端(可能很多的B)。这应该一直重复。
我已经阅读了手册,但我不明白为什么这不起作用。 让我们假设我通过指针给所有线程赋予了这些变量(正确的,我已经检查过了):
pthread_mutex_t* mutex;
pthread_cond_t* cond;
int* variable;
我有以下代码:
THREAD 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);
}
THREAD 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);
}
我没有陷入僵局,但不幸的是,这并不像我预期的那样有效。有人可以给我一个解释我该怎么办?我将不胜感激任何帮助。
答案 0 :(得分:2)
可能的问题是,在任何休眠线程有机会将其视为*variable = 1
之前,线程A会立即设置0
。仅仅因为条件变量将唤醒等待线程并不意味着那些被唤醒的线程将被足够快地调度以防止线程A再次写入*variable
。