【发布时间】:2015-09-14 08:16:18
【问题描述】:
我试图找出在多线程产生和单线程消耗的情况下互斥和条件变量的执行情况。
这里是示例代码:
#include<stdio.h>
#include<pthread.h>
int done = 0;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t c = PTHREAD_COND_INITIALIZER;
void *thr2(void *arg) {
pthread_t self;
self=pthread_self();
pthread_mutex_lock(&m);
done = 1;
pthread_cond_signal(&c);
pthread_mutex_unlock(&m);
return NULL;
}
void *thr1(void *arg) {
pthread_t self;
self=pthread_self();
pthread_mutex_lock(&m);
while (done == 0)
{
pthread_cond_wait(&c, &m);
}
pthread_mutex_unlock(&m);
}
int main(int argc, char *argv[]) {
pthread_t p,q,r;
pthread_create(&q, NULL, thr1, NULL);
sleep(2);
pthread_create(&p, NULL, thr2, NULL);
pthread_create(&r, NULL, thr2, NULL);
pthread_join(p,NULL);
pthread_join(q,NULL);
pthread_join(r,NULL);
return 0;
}
在这段代码中,我期望 thread1 等待条件变量完成。因此,线程 2 或线程 3 当任何一个启动并获得互斥锁并完成更改为 1 时。它必须向线程 1 发出信号,线程 1 正在等待,线程 1 将开始执行。
但是,我看到即使 thread1 正在等待条件变量 done=0 并且在来自 thread2 的信号之后,我为 thread2 方法创建的另一个线程获得了互斥锁。
我想知道我对输出的期望是否有任何问题。我正在尝试以类似的情况实现阻塞队列,其中可能有多个生产者和单个消费者。
谢谢, 普瓦南。
【问题讨论】: