目前,我正在为实时图形应用程序的渲染部分使用生产者消费者模型。消费者将不断地在我们的队列中寻找数据(无限循环);但是我担心这可能会导致我的模拟与主循环不同步。我认为这是快速生产者慢消费者问题 - 由于模拟被限制在一定时间内这一事实而变得更加复杂。
问题 - 什么是最好的方法来保持这一切的平衡并确保消费者有足够的时间完成,而且模拟不会在之前移动到下一帧我们完成了当前帧的渲染(或者至少能够检测到这一点并跳过渲染下一帧 - 或者中断正在渲染的当前帧)我目前只是在每个消费者完成后中断并加入
第二个问题:如果您查看下面的代码,您会发现我目前只是在将渲染作业添加到队列后调用中断和加入 - 这允许线程在它需要的所有时间完成其操作,并在完成时响应中断。 在调用 interrupt_all 和 join_all 之后,如何重用线程池中的线程? (即如果我再次调用 drawNextFrame)
生产者是执行主线程的一部分(我认为这不会影响任何事情)
pseudo code:
void renderSystem::init()
create queue to hold work;
create consumer threads of type RenderConsumer set to watch our queue;
add threads to thread_pool of consumers called 'RenderThreads'
void renderSystem::drawNextFrame()
for each thread in 'RenderThreads' divy up work;
add work assignment to queue;
//RenderThreads will now successfully start pulling data from our queue
renderThreads.interupt_all();
renderThreads.join_all();
int main()
renderer = renderSystem class;
renderer.init()
while(not_gameover)
renderer.drawNextFrame();
doOtherCoolStuff();
profit(?)
return(0)
如果您需要查看消费者类,请参见下文:
pseudo code:
RenderConsumer::operator () ()
while(true)
try to dequeue from queue
//digest any packet we get
for each ( pixel in packet )
computePrettyStuff()
//we are now done with packet that we got
this_thread::interruption_point();
我尽量让这个简单易懂,谢谢你的时间
最佳答案
#1。我会在每次渲染后计算队列中的数量来做到这一点。如果它太高,那么要么
一个。转储队列
将 bool 变量设置为 false 该变量将在线程之间共享,当生产者发现它为 false 时,它开始等待条件变量。当队列再次下降到可接受的水平时,消费者会通知生产者。
#2。 join_all 可能不可能,因为 join_all 的后置条件是
Every thread in the group has terminated.
根据引用。
然而,使用 barriers 而不是 join_all 可能是可行的,但是你必须找到一种方法来为它们提供数据,而这最终总是需要一些更多的共享变量。
关于c++ - 中断或加入后重用 Boost 线程(来自线程池),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4391178/