我最近在课堂上学习了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的数字。我认为实现信号量可以确保有界缓冲区(这里我没有真正的缓冲区)。
提前致谢。