目前,我正在使用生产者消费者模型来渲染实时图形应用程序的部分。消费者将不断在我们的队列中寻找数据(无限循环);但是我担心这可能会导致我的模拟与主循环不同步。我认为这是快速生产者慢消费者问题 - 模拟被限制在一定时间内的事实使情况更加复杂。
问题-保持这一切平衡并确保消费者有足够的时间完成的最佳方法是什么,而且在我们完成渲染当前帧之前模拟不会移动到下一帧(或者至少能够检测到这一点并跳过渲染下一帧 - 或中断正在渲染的当前帧)我目前只是在每个消费者完成后中断和加入
第二个问题:如果您查看下面的代码,您会看到我目前只是在将渲染作业添加到队列后调用中断和加入 - 这允许线程始终完成其操作并响应中断等结束了。在调用 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();
我试着让这个简单快速地消化,谢谢你的时间