gpt4 book ai didi

c++ - 使用 boost::lock_guard 进行简单的共享数据锁定

转载 作者:IT老高 更新时间:2023-10-28 22:35:32 25 4
gpt4 key购买 nike

我是 Boost 库的新手,我正在尝试实现一个在共享队列上运行的简单生产者和消费者线程。我的示例实现如下所示:

#include <iostream>
#include <deque>
#include <boost/thread.hpp>

boost::mutex mutex;
std::deque<std::string> queue;

void producer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);

std::cout << "producer() pushing string onto queue" << std::endl;

queue.push_back(std::string("test"));
}
}

void consumer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);

if (!queue.empty()) {
std::cout << "consumer() popped string " << queue.front() << " from queue" << std::endl;

queue.pop_front();
}
}
}

int main()
{
boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);

sleep(5);

producer_thread.detach();
consumer_thread.detach();

return 0;
}

这段代码按我的预期运行,但是当 main 退出时,我得到

/usr/include/boost/thread/pthread/mutex.hpp:45:    
boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
consumer() popped string test from queue
Aborted

(我不确定 consumer 的输出是否与该位置相关,但我已将其保留。)

我在使用 Boost 时是否做错了什么?

最佳答案

有点离题但相关 imo(...等待评论中的火焰)。

这里的消费者模型非常贪婪,不断循环和检查队列中的数据。如果您在数据可用时使用线程间信号而不是这种锁定和窥视循环来确定地唤醒您的消费者线程,它将更有效(浪费更少的 CPU 周期)。这样想:当队列是空的时,这本质上是一个紧密的循环,只是被获取锁的需要打破了。不理想?

void consumer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);

if (!queue.empty()) {
std::cout << "consumer() popped string " << queue.front() << " from queue" << std::endl;

queue.pop_front();
}
}
}

我了解您正在学习,但我不建议在“真实”代码中使用它。不过,对于学习图书馆来说,这很好。值得称赞的是,这是一个比理解如何使用 lock_guard 所需的更复杂的示例,因此您的目标很高!

最终,您很可能会为队列构建(或更好,如果可用,重用)代码,在需要工作时向工作人员发出信号,然后您将在工作线程中使用 lock_guard调解对共享数据的访问。

关于c++ - 使用 boost::lock_guard 进行简单的共享数据锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3726570/

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