gpt4 book ai didi

C++ 标准条件变量涵盖了很多共享变量

转载 作者:太空宇宙 更新时间:2023-11-04 16:22:15 29 4
gpt4 key购买 nike

我正在用 C++ 编写一个多线程程序,在我的主线程中,我正在等待我的其他线程将包放入不同的队列中。取决于包的种类以及它们来自哪个线程。

队列本应受到互斥锁的保护。

但我主要不想做:

while(true)
if(!queue1->empty)
{
do stuff
}
if(!queue2->empty)
{
do stuff
}
etc

因此,您需要使用条件变量来向 main 发出信号,表明某些内容已发生变化。现在我只能阻塞 1 个条件变量,所以我需要所有这些线程使用相同的条件变量和随附的互斥量。现在我不想真正使用这个互斥锁来锁定我的所有线程。这并不意味着当一个线程正在写入一个队列时,另一个线程不能写入一个完全不同的队列。所以我为每个队列使用单独的互斥体。但是现在我该如何使用条件变量附带的这个额外的互斥量。

它是如何使用 boost 使用 2 个线程和 1 个队列完成的,与 std 非常相似。 http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html :

template<typename Data>
class concurrent_queue
{
private:
boost::condition_variable the_condition_variable;
public:
void wait_for_data()
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
}
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
bool const was_empty=the_queue.empty();
the_queue.push(data);
if(was_empty)
{
the_condition_variable.notify_one();
}
}
// rest as before
};

那么如何解决这个问题呢?

最佳答案

我会说你的问题的关键在于:

现在我不想真正使用这个互斥锁来锁定我的所有线程。这并不意味着当一个线程正在写入一个队列时,另一个线程不能写入一个完全不同的队列。所以我为每个队列使用单独的互斥量。

为什么?因为:

... 包进来的速度相对较慢。大多数时候队列是空的

在我看来,您将自己设计到了一个角落,因为您认为自己需要某些东西,而实际上您可能并不需要它,因为一个队列实际上可以在您提到的使用场景中工作。

我想说的是从一个队列开始,看看它能让你走多远。然后,当您遇到确实有许多线程在等待单个互斥锁的限制时,您将获得有关该问题的更多信息,因此能够更好地解决它。

本质上,我想说您面临此问题的原因是过早的设计优化,而解决该问题的方法是立即回溯并更改设计。

关于C++ 标准条件变量涵盖了很多共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15558902/

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