在C中使用Pthread库

时间:2015-12-08 07:31:59

标签: c pthreads producer-consumer

我有这段代码:

#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()函数时。我不明白这个的原因。

有人可以帮助我,并为此问题提出可能的解决方案吗?我希望第一次生成器函数应该执行。

2 个答案:

答案 0 :(得分:2)

通过共享变量进行的线程间同步几乎肯定是一个坏主意,但即使如此,共享变量至少应该被声明为volatile

考虑使用真实同步原语,例如semaphores真实 Pthreads mutexes

您在此处使用mutex这个词是不正确的;它不是互斥体。应该在同一个线程中锁定并释放互斥锁,以防止其他线程访问资源。如果那不是你想要的行为,那么互斥是错误的原语 - 也许你需要一个信号量而不是互斥量。

答案 1 :(得分:0)

代码被破坏的方式太多,无法理解发生了什么。想到这两个问题。

  1. i--和i ++不是原子操作,所以mutex或full都没有你认为他们所做的值。

  2. 您正在创建20个主题,但只加入最后两个主题。

  3. 代码中没有内存障碍,因此实际上未定义SMP系统内存更改的顺序。