gpt4 book ai didi

c++ - 优化生产者-消费者线程之间的交互

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

我有一个生产者-消费者多线程交互的实现。它有效。但我觉得在执行过程中,消费者线程和生产者之间的等待状态发生得太频繁了。在我的例子中,消费者以随机间隔访问队列并获取数据从它开始。现在,生产者线程在整个进程生命周期内运行。生产者线程作为缓存机工作。它在循环中检查队列的大小是否小于允许的最大缓存大小,如果是这种情况,它会继续推送新数据进入该缓存。我担心的是,当消费者尝试访问队列时,最后一个仍然被生产者线程锁定,消费者应该等待。理想情况下,我想让消费者导致生产者“卡住”并解锁当消费者从队列中检索数据时立即。

这是我现在的做法:

   //Called by consumer(main thead) to retrieve data from cache
uint8_t* Worker::GetFrame() {

boost::unique_lock<boost::mutex> lk(_frameCacheMutex);
//If the cache is empty:
while (0 == _frames_cache.size()) {
//tell Producer to push data into cache
_fill_cache_wait_cond.notify_one();
//wait for the data to arrive(will be signaled by worker thread)
_get_frame_wait_cond.wait(lk);

}
uint8_t * fr = _frames_cache.front();
_frames_cache.pop();
// notify worker thread to continue caching
_fill_cache_wait_cond.notify_one();

return fr;
}

生产者线程:

    void Worker::operator () () {
//Some init here..
while (isRunning) {
boost::unique_lock<boost::mutex> lk(_frameCacheMutex);

/// Here create the data for cache...

_frames_cache.push(data);

/// Notify waiting main thread to take data
_get_frame_wait_cond.notify_one();

/// If the cache is full ,wait
while (_frames_cache.size() == cacheMaxSize ){

_fill_cache_wait_cond.wait(lk);

}

}

}

最佳答案

此时,生产者锁定队列,直到队列满为止。只有在那个时候,消费者才能访问队列,但它立即发出信号,表明队列不再满,因此生产者再次锁定队列。

至少在数据准备好推送后才加锁,尽量限制推送 Action 。
如果可能,您还可以 boost 消费者的优先级。

顺便说一下,这不会解决您眼前的问题,但您可以限制 notify_one() 调用的次数,因为您只需要在条件实际发生变化(不再为零)时发送一个给消费者,对生产者来说不再是完整的)。

关于c++ - 优化生产者-消费者线程之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25304143/

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