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();

我试着让这个简单快速地消化,谢谢你的时间

4

1 回答 1

1

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

一个。转储队列

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

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

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

根据参考。

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

于 2010-12-11T05:09:59.690 回答