gpt4 book ai didi

multithreading - C++ 11非阻塞生产者/消费者

转载 作者:行者123 更新时间:2023-12-04 08:52:27 24 4
gpt4 key购买 nike

我有一个C++ 11应用程序,该程序具有生成数据的高优先级线程和使用它的低优先级线程(在我的情况下,是将其写入磁盘)。我想确保高优先级生产者线程不会被阻塞,即它仅使用无锁算法。

使用无锁队列,我可以将数据从生产者线程推送到队列,并从消费者线程轮询数据,从而达到我的目标。我想修改程序,以使使用者线程在不事件而不是轮询时阻塞。

似乎C++ 11条件变量可能对阻止使用者线程有用。任何人都可以向我展示如何使用它的示例,同时避免消费者在队列中仍存有数据的情况下休眠吗?更具体地说,我想确保在生产者将最后一个项目插入队列后,始终在一定的时间内唤醒消费者。生产者保持不阻塞也很重要。

最佳答案

It seems like the C++11 condition variable might be useful to block the consumer thread. Can anyone show me an example of how to use it, while avoiding the possibility that the consumer sleeps with data still in the queue?



要使用条件变量,您需要互斥体和条件。在您的情况下,条件将是“队列中有可用数据”。由于生产者将使用无锁更新来生产工作,因此消费者必须使用相同形式的同步来消耗工作,因此互斥锁实际上将不会用于同步,并且仅由消费者线程使用,因为没有等待条件变量的其他方法。
// these variables are members or otherwise shared between threads
std::mutex m_mutex;
std::condition_variable m_cv;
lockfree_queue m_data;

// ...

// in producer thread:
while (true)
{
// add work to queue
m_data.push(x);
m_cv.notify_one();
}

// in consumer thread:
while (true)
{
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, []{ return !m_data.empty(); });
// remove data from queue and process it
auto x = m_data.pop();
}

如果队列在等待之前为空,则条件变量将仅在 wait调用中阻塞。条件变量可能会虚假地唤醒,或者因为它是由生产者通知的,但在任何一种情况下,如果队列为非空,则只会从 wait调用返回(而不是再次休眠)。通过使用带谓词的 condition_variable::wait重载可以保证这一点,因为条件变量始终会为您重新检查谓词。

由于互斥锁仅由使用者线程使用,因此它实际上可以在该线程本地(只要您只有一个使用者,并且有多个使用者,则它们都需要共享同一个互斥锁以等待相同的condvar)。

关于multithreading - C++ 11非阻塞生产者/消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414933/

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