Multithreading 读取/写入共享变量b/w pthread未同步

Multithreading 读取/写入共享变量b/w pthread未同步,multithreading,pthreads,Multithreading,Pthreads,我正在尝试使用pthreads实现一个简单的生产者/消费者代码。生产者线程和消费者线程之间唯一的公共共享数据是count变量,用于计算共享数组中可用元素的数量。发生的情况是,一个线程中更新的计数没有反映在另一个线程中。如何确保一个线程中对计数的写入也出现在另一个线程中?我错过什么了吗 #包括 #包括 #包括 #定义数组大小为100 int数组[数组大小]; 易变整数计数; int头; 内尾; pthread_cond_t full=pthread_cond_初始值设定项; pthread_con

我正在尝试使用pthreads实现一个简单的生产者/消费者代码。生产者线程和消费者线程之间唯一的公共共享数据是
count
变量,用于计算共享数组中可用元素的数量。发生的情况是,一个线程中更新的
计数没有反映在另一个线程中。如何确保一个线程中对
计数的写入也出现在另一个线程中?我错过什么了吗

#包括
#包括
#包括
#定义数组大小为100
int数组[数组大小];
易变整数计数;
int头;
内尾;
pthread_cond_t full=pthread_cond_初始值设定项;
pthread_cond_t empty=pthread_cond_初始值设定项;
pthread\u mutex\u t mutex=pthread\u mutex\u初始值设定项;
无效*生产者(无效*参数)
{
int res=0;
而(1){
pthread_mutex_lock(&mutex);
if(计数==数组大小){
printf(“\n没有等待消费者消费的新项目的空间”);
pthread_cond_wait(&empty,&mutex);
//有时,为什么计数变量仍然是数组大小。
//如何确保写入中的“count”变量
//消费者线程在生产者中立即可见
//线?
if(计数==数组大小){
printf(“\n计数仍然是数组大小”);
出口(0);
}
}
头%=阵列大小;
计数++;
数组[头]=头;
printf(“\n生产%d/%d”,头,计数);
head++;
pthread_mutex_unlock(&mutex);
pthread_cond_信号(&full);
}
}
无效*使用者(无效*参数)
{
int res=0;
而(1){
pthread_mutex_lock(&mutex);
如果(计数=0){
printf(“\n没有等待生产商生产的可用项目”);
pthread_cond_wait(&full,&mutex);
//有时,为什么计数变量仍然是零。我该怎么做
//确保写入生产者中的“count”变量
//线程是否立即在使用者线程中可见?
如果(计数=0){
printf(“\n计数仍然为零”);
出口(0);
}
}
尾%=数组大小;
int ele=数组[尾];
计数--;
printf(“\n总计%d/%d”,尾部,计数);
tail++;
pthread_mutex_unlock(&mutex);
pthread_cond_信号(&empty);
}
}
int main()
{
pthread\u t producer\u线程;
pthread_t consumer_线程;
int-ret=0;
setbuf(标准输出,空);
ret=pthread\u create(&producer\u thread,NULL,producer,NULL);
如果(ret!=0){
printf(“\n无法创建生产者线程%d”,ret);
转到出口;
}
ret=pthread\u create(&consumer\u thread,NULL,consumer,NULL);
如果(ret!=0){
printf(“\n无法创建使用者线程%d”,ret);
转到出口;
}
pthread_join(生产者线程,NULL);
pthread_join(使用者线程,NULL);
出口:
返回ret;
}
99年72月制作
制作73/100
没有空间放置等待消费者消费的新项目
消耗74/99
消耗75/98
消耗76/97
消耗77/96
1997年7月74日制作
1998年7月75日制作
1999年7月76日制作
制作77/100
没有空间放置等待消费者消费的新项目

count仍然是ARRAY_SIZE我相信您忽略了一个事实,即条件等待必须在等待返回后再次检查谓词。一定有一个循环

除信号/通知呼叫外,等待可能因各种原因而结束

produced 72/99
produced 73/100
No space for new items waiting for consumer to consume
consumed 74/99
consumed 75/98
consumed 76/97
consumed 77/96
produced 74/97
produced 75/98
produced 76/99
produced 77/100
No space for new items waiting for consumer to consume
count is still ARRAY_SIZE   <------ incorrect
consumed 21/2
consumed 22/1
consumed 23/0
No items available waiting for producer to produce
produced 24/1
consumed 24/0
No items available waiting for producer to produce
produced 25/1
produced 26/2
produced 27/3
consumed 25/2
consumed 26/1
consumed 27/0
No items available waiting for producer to produce
count is still zero   <------ incorrect