我有这段代码:
#include<stdio.h>
#include<pthread.h>
int mutex=1,i=0,full=0;
void p(int *s)
{
while(*s<=0)
;
*s--;
}
void v(int *s)
{
*s++;
}
void *producer()
{
p(&mutex);
printf("Producer is producing\n");
v(&mutex);
v(&full);
}
void *consumer()
{
p(&full);
p(&mutex);
printf("Consuming\n");
v(&mutex);
}
int main()
{
pthread_t thread1,thread2;
int k;
for(k=0;k<10;k++)
{
pthread_create(&thread1,NULL,(void *(*)(void *))producer,NULL);
pthread_create(&thread2,NULL,(void *(*)(void *))consumer,NULL);
}
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
}
在消费者功能中添加p(&full)
之前,此代码工作正常,每次从两个函数中随机选择一个;但是在p(&full)
函数中添加consumer()
后,每次执行producer()
函数时。我不明白这个的原因。
有人可以帮助我,并为此问题提出可能的解决方案吗?我希望第一次生成器函数应该执行。
答案 0 :(得分:2)
通过共享变量进行的线程间同步几乎肯定是一个坏主意,但即使如此,共享变量至少应该被声明为volatile
。
考虑使用真实同步原语,例如semaphores
或真实 Pthreads mutexes。
您在此处使用mutex
这个词是不正确的;它不是互斥体。应该在同一个线程中锁定并释放互斥锁,以防止其他线程访问资源。如果那不是你想要的行为,那么互斥是错误的原语 - 也许你需要一个信号量而不是互斥量。
答案 1 :(得分:0)
代码被破坏的方式太多,无法理解发生了什么。想到这两个问题。
i--和i ++不是原子操作,所以mutex或full都没有你认为他们所做的值。
您正在创建20个主题,但只加入最后两个主题。
代码中没有内存障碍,因此实际上未定义SMP系统内存更改的顺序。