gpt4 book ai didi

c++ - 生产者/消费者,消费者线程从未执行过

转载 作者:行者123 更新时间:2023-11-30 02:21:19 25 4
gpt4 key购买 nike

创建了一个具有生产者线程和消费者线程的程序。

生产者线程每隔一秒不断地插入一个栈,栈被互斥体保护。

消费者线程不断从栈中弹出。

意外的行为是,生产者线程一直在运行,而消费者线程永远没有机会弹出堆栈。

我该如何继续调查这个问题?非常感谢。

#include <stack>
#include <chrono>

#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>


std::mutex mtx;
std::stack<int> the_stack;

void producer(const int id)
{
while(1)
{
mtx.lock();
the_stack.push(0);
std::cout << "Producer " << id << " push" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
mtx.unlock();
}
}//producer


void consumer(const int id)
{
while(1)
{
mtx.lock();
if (!the_stack.empty())
{
std::cout << "Consumer " << id << " pop" << std::endl;
the_stack.pop();
}
mtx.unlock();
}
}//consumer


int main()
{
std::thread thread_0(producer, 0);
std::thread consum_0(consumer, 0);

thread_0.join();
consum_0.join();

return 0;
}//main;

最佳答案

生产者在持有互斥锁的同时正在休眠。这很难让消费者有机会锁定互斥量。

如果将 sleep 语句放在互斥保护区之外,它将按预期工作。

void producer(const int id)
{
while(1)
{
....
mtx.unlock();
std::this_thread::sleep_for(std::chrono::seconds(1)); // below the unlock operation
}

关于c++ - 生产者/消费者,消费者线程从未执行过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com