信号量 - 消费者生产者奇怪的结果

时间:2017-10-24 21:53:02

标签: c concurrency operating-system semaphore producer-consumer

我最近在课堂上学习了Semaphore和Consumer Producer的问题并遇到了这个问题: 我使用两个信号量来指示缓冲区加上互斥锁中的空和满。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>


pthread_mutex_t mutex;


sem_t empty;
sem_t full;

int fill =0 ;

void *producer(void *param);
void *consumer(void *param);

void* producer(void *param)
{
    while(1) {
        sem_wait(&empty);
        pthread_mutex_lock(&mutex);
        fill++;
        pthread_mutex_unlock(&mutex);
        sem_post(&full);
    }
}


void *consumer(void *param)
{
    while(1){
        sem_wait(&full);
        pthread_mutex_lock(&mutex);
        fill--;
        pthread_mutex_unlock(&mutex);
        sem_post(&empty);
    }
}
void* dynamic_output(void* ptr){
    while(1){

    printf("fill = :%d\n",fill);

    sleep(1);
}}


int main()
{
  pthread_mutex_init(&mutex, NULL);
  sem_init(&empty, 0, 5);
  sem_init(&full, 0, 0);
  pthread_t gid1,oid1;
  pthread_t dy;

  pthread_create(&dy,NULL,dynamic_output,NULL);

  pthread_create(&gid1,NULL,&producer,NULL);
  pthread_create(&oid1,NULL,&consumer,NULL);

  pthread_join(gid1,NULL);
  pthread_join(oid1,NULL);

    return 0;
}

这里我只是在生产者和消费者中放入一个名为'fill'的变量。由于我将空信号量发送到5,我预计'fill'将在0到5之间浮动但是当我打印出来时我发现了奇怪的结果:

fill = :0
fill = :19
fill = :446
fill = :112
fill = :156
fill = :-564
fill = :-345
fill = :-744
fill = :-1293

我真的不明白填充是如何成为负数或大于5的数字。我认为实现信号量可以确保有界缓冲区(这里我没有真正的缓冲区)。

提前致谢。

0 个答案:

没有答案