生产者消费者问题c没有消费者的输出
producer consumer problem c no output for consumer
我在这里尝试为我的插入和删除方法使用循环 queish 东西,以及使用插入和删除函数进行同步
我正在使用 gcc file.c -lpthread -lrt 和 运行 ./a.out 50 1 1.
进行编译
运行我的制作人正确地制作和输出
producer thread #0
consumer thread #0
producer produced 7
但无论出于何种原因我无法让我的消费者输出,
我试过把我的return0;对于锁和信号量之外的每个函数,它确实输出消费者,但是太多次了,每个线程应该只 运行 一次,
它还使用其中的标准计数信号量 2 以及单个互斥锁
这是我将 return 移到锁下方时发生的情况
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 应该只有一个生产者和一个消费者
更新:正在开发一个新版本,所以收回我以前的代码,post 新版本
在函数 insert_item()
和 remove_item()
中,returning(函数执行结束)发生在执行 pthread_mutex_unlock()
之前。这将防止他们解锁并防止第二次或以后执行这些功能。
取而代之的是,您应该将 return 的值存储在变量中,并在解锁后存储 return 。可以这样做:
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;
}
我在这里尝试为我的插入和删除方法使用循环 queish 东西,以及使用插入和删除函数进行同步 我正在使用 gcc file.c -lpthread -lrt 和 运行 ./a.out 50 1 1.
进行编译运行我的制作人正确地制作和输出
producer thread #0
consumer thread #0
producer produced 7
但无论出于何种原因我无法让我的消费者输出,
我试过把我的return0;对于锁和信号量之外的每个函数,它确实输出消费者,但是太多次了,每个线程应该只 运行 一次,
它还使用其中的标准计数信号量 2 以及单个互斥锁
这是我将 return 移到锁下方时发生的情况
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 应该只有一个生产者和一个消费者
更新:正在开发一个新版本,所以收回我以前的代码,post 新版本
在函数 insert_item()
和 remove_item()
中,returning(函数执行结束)发生在执行 pthread_mutex_unlock()
之前。这将防止他们解锁并防止第二次或以后执行这些功能。
取而代之的是,您应该将 return 的值存储在变量中,并在解锁后存储 return 。可以这样做:
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;
}