【发布时间】:2021-11-13 02:33:28
【问题描述】:
我有一个用 c 编写的多线程程序,它有 3 个线程,主线程、生产者线程和消费者线程。该代码使用条件变量来处理信号和处理发出的信号。问题是当我运行程序时,似乎一些发出的信号丢失了,并且没有被任何处理程序捕获。有人可以向我解释这些输出吗?
全局变量:
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int avail = 0;
生产者线程:
static void *producer_thread(void *arg)
{
for (size_t i = 0; i < 10; i++)
{
pthread_mutex_lock(&mtx);
avail = 1;
// sleep(2);
pthread_mutex_unlock(&mtx);
pthread_cond_broadcast(&cond);
printf("sent signal#%ld from signaling thread\n", i);
}
pthread_exit(NULL);
}
消费者线程:
static void *consumer_thread(void *arg)
{
while (1)
{
pthread_mutex_lock(&mtx);
while(0 == avail)
{
pthread_cond_wait(&cond, &mtx);
}
printf("received signal from consuming_thread\n");
avail = 0;
pthread_mutex_unlock(&mtx);
}
}
主线程:
int main(int argc, char *argv[])
{
pthread_t tid1, tid2;
int rc;
rc = pthread_create(&tid1, NULL, consumer_thread, NULL);
if(rc){
printf("error in pthread_create form consuming_thread\n");
exit(-1);
}
rc = pthread_create(&tid2, NULL, producer_thread, NULL);
if(rc){
printf("error in pthread_create form signalling thread\n");
exit(-1);
}
pthread_exit(NULL);
}
样本输出:
sent signal#0 from signaling thread
received signal from consuming_thread
sent signal#1 from signaling thread
sent signal#2 from signaling thread
sent signal#3 from signaling thread
sent signal#4 from signaling thread
sent signal#5 from signaling thread
sent signal#6 from signaling thread
sent signal#7 from signaling thread
sent signal#8 from signaling thread
received signal from consuming_thread
sent signal#9 from signaling thread
received signal from consuming_thread
【问题讨论】:
-
输出是什么?还有,avail的定义是什么?
-
@Effie 问题已更新
-
通常当人们发布条件变量的损坏代码时,我会告诉他们条件变量不是信号量。显然,当人们使用条件变量发布行为良好的代码时,我必须告诉他们条件变量不是两个信号量。
-
@Effie 简单来说,我们有一个产生信号的线程和一个必须正确捕获发出的信号的线程(尽管我的代码可能是错误的,我想帮我纠正它,谢谢!)
-
@EOF 你的意思是我以错误的方式使用条件变量?
标签: c multithreading condition-variable