中断或加入后重用Boost线程(来自线程池)

时间:2010-12-08 18:59:40

标签: c++ multithreading boost boost-thread producer-consumer

目前我正在使用生产者消费者模型来实现实时图形应用程序的渲染部分。消费者将不断寻找队列中的数据(无限循环);但是我担心这会导致我的模拟与主循环不同步。我认为这是快速的生产者缓慢的消费者问题 - 由于模拟被限制在一定时间内这一事实而复杂化。

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

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

答案 0 :(得分:1)

#1。我会通过在每次渲染后计算队列中的数量来完成此操作。如果它太高,那么

一个。转储队列

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

#2。 join_all可能不可能,因为join_all的后置条件是

  

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

根据参考文献。

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