2010-12-08 97 views
0

此刻,我正在使用生产者消费者模型来实现实时图形应用程序的渲染部分。消费者会不断地在队列中查找数据(无限循环);不过,我担心这可能会导致我的模拟主循环不同步。我认为这是快速生产者缓慢的消费者问题 - 再加上模拟受到一定时间限制的事实。在中断或加入后重用线程(从线程池)

问题 - 是什么让这一切的平衡,并确保消费者有足够的时间来完成的最好的方法,而且还模拟不会移动到下一帧,我们完成之前渲染我们目前的帧(或至少能够检测到这一点,并跳过渲染下一帧 - 或中断当前的帧渲染)我目前只是中断和每一个消费者完成

第二个问题后加盟:如果你看看在下面的代码中,您将看到我目前只是在将渲染作业添加到队列后调用中断和连接 - 这允许线程一直需要完成其操作,并在完成时响应中断。 如何在调用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

#1。我会通过在每次渲染之后计算队列中的数量来做到这一点。如果它太高,那么要么

a。转储队列

b。将布尔变量设置为false 该变量将在线程之间共享,并且当生产者发现它为假时,它将开始等待条件变量。当队列再次降到可接受的水平时,消费者通知生产者。

#2。也许不可能join_all,作为后置条件,以join_all是

组中的每个线程都有 终止。

根据参考。

然而,使用障碍而不是join_all可能会有可能,但是您必须找到一种方法为它们提供数据,这些数据总是会需要更多的共享变量。