问题描述
在这里,我试图为我的插入和删除方法使用一个循环的 queish 东西,以及使用插入和删除函数进行同步 我用 gcc file.c -lpthread -lrt 编译并用 ./a.out 50 1 1 运行。
在运行我的生产者后正确生产和输出
producer thread #0
consumer thread #0
producer produced 7
但无论出于何种原因,我都无法让我的消费者输出,
我试过把我的回报设为 0;对于锁和信号量之外的每个函数,它确实输出消费者,但是太多次了,每个线程只应该运行一次,
它也使用标准的计数信号量 2 以及单个互斥锁
当我将返回移动到锁下方时会发生这种情况
producer thread #0
consumer thread #0
producer produced 7
consumer consumed 7
producer produced 5
producer produced 5
consumer consumed 5
consumer consumed 2
producer produced 7
producer produced 4
consumer consumed 7
consumer consumed 4
producer produced 6
consumer consumed 6
producer produced 1
consumer consumed 1
producer produced 9
consumer consumed 9
producer produced 2
consumer consumed 2
producer produced 6
consumer consumed 6
实际上,如果我运行 ./a.out 50 1 1 应该只有一个生产者和一个消费者
更新:正在为此开发一个新版本,因此收回我以前的代码,将发布新版本
解决方法
在函数 insert_item()
和 remove_item()
中,返回(函数的执行结束)发生在执行 pthread_mutex_unlock()
之前。这将阻止它们解锁并阻止函数的第二次或以后执行。
代替此,您应该将要返回的值存储在变量中,并在解锁后返回该值。可以这样做:
int insert_item(buffer_item item)
{
int ret;
sem_wait(&empty);
pthread_mutex_lock(&lock);
if (size_check < BUFFER_SIZE)
{
buffer[insertBounds_check++] = item;
size_check++;
ret = 0;
}
else
{
ret = -1;
}
pthread_mutex_unlock(&lock);
sem_post(&full);
return ret;
}