【发布时间】:2015-05-26 13:28:19
【问题描述】:
在下面的代码中:
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mtx;
pthread_cond_t cond;
int how_many = 10;
int pool = 0;
void * producer(void * ptr)
{
while (how_many > 0)
{
pthread_mutex_lock(&mtx);
printf("producer: %d\n", how_many);
pool = how_many;
how_many--;
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&cond);
}
pthread_exit(0);
}
void * consumer(void * ptr)
{
while (how_many > 0)
{
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cond, &mtx);
printf("consumer: %d\n", pool);
pool = 0;
pthread_mutex_unlock(&mtx);
}
pthread_exit(0);
}
int main(int argc, char ** argv)
{
pthread_t prod, cons;
pthread_mutex_init(&mtx, 0);
pthread_cond_init(&cond, 0);
pthread_create(&cons, 0, consumer, 0);
pthread_create(&prod, 0, producer, 0);
pthread_join(prod, 0);
pthread_join(cons, 0);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mtx);
return 0;
}
我没有得到预期的输出。
预期输出:
Producer:10
Consumer:10
Producer:9
Consumer:9
Producer:8
Consumer:8
Producer:7
Consumer:7
Producer:6
Consumer:6
Producer:5
Consumer:5
Producer:4
Consumer:4
Producer:3
Consumer:3
Producer:2
Consumer:2
Producer:1
Consumer:1
实际输出:
producer: 10
producer: 9
producer: 8
producer: 7
producer: 6
producer: 5
producer: 4
producer: 3
producer: 2
producer: 1
另外,在消费者端,如果我们锁定并等待信号,生产者如何获得锁定以便他可以将信号发送给消费者?
- 会死锁吗?
- 我的朋友都在推荐
pthread_cond_wait(&cond, &mtx);实际上会解锁资源,直到它从生产者那里得到信号。这是真的吗?
【问题讨论】:
-
您想从临界区内部发出条件信号,即在解锁相关互斥体之前。
-
“我的朋友们建议……这是真的吗?”根据文档,是的。
-
我在生产者端释放锁后使用了 sleep(1),它工作正常:-) 我理解 pthread_cond_wait() 在收到信号之前不会持有锁。
标签: c multithreading mutex condition-variable