在中断或加入后重用线程(从线程池)
问题描述:
此刻,我正在使用生产者消费者模型来实现实时图形应用程序的渲染部分。消费者会不断地在队列中查找数据(无限循环);不过,我担心这可能会导致我的模拟主循环不同步。我认为这是快速生产者缓慢的消费者问题 - 再加上模拟受到一定时间限制的事实。在中断或加入后重用线程(从线程池)
问题 - 是什么让这一切的平衡,并确保消费者有足够的时间来完成的最好的方法,而且还模拟不会移动到下一帧,我们完成之前渲染我们目前的帧(或至少能够检测到这一点,并跳过渲染下一帧 - 或中断当前的帧渲染)我目前只是中断和每一个消费者完成
第二个问题后加盟:如果你看看在下面的代码中,您将看到我目前只是在将渲染作业添加到队列后调用中断和连接 - 这允许线程一直需要完成其操作,并在完成时响应中断。 如何在调用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。我会通过在每次渲染之后计算队列中的数量来做到这一点。如果它太高,那么要么
a。转储队列
b。将布尔变量设置为false 该变量将在线程之间共享,并且当生产者发现它为假时,它将开始等待条件变量。当队列再次降到可接受的水平时,消费者通知生产者。
#2。也许不可能join_all,作为后置条件,以join_all是
组中的每个线程都有 终止。
根据参考。
然而,使用障碍而不是join_all可能会有可能,但是您必须找到一种方法为它们提供数据,这些数据总是会需要更多的共享变量。