我有一个线程在等待来自多个其他线程的某些事件,这些线程依赖于来自该线程的事件才能继续处理。如何编写代码以避免忙等待?
更具体地说,我有多个线程,它们分别处理视频帧并将其写入屏幕缓冲区(不同位置)。当它们全部完成后,一个线程发送缓冲区以进行绘制,然后这些线程等待绘制调用完成,然后再继续处理它们的下一帧。
这需要用C++实现。使用的C++标准没有限制。
编辑:std::condition_variable
似乎不是解决方案。因为它需要互斥量,而在运行时无法知道线程(互斥量)的数量,也不能将互斥量放入std::vector
中。
我的程序伪代码如下:
drawThread:
loop:
for each processThread:
wait for event
draw()
processThread:
loop:
process()
notify drawThread
wait for draw to finish
编辑:我尝试过:
std::vector<std::atomic_bool> ready_flags;
std::atomic_bool finished_drawing = false;
void drawThread()
{
while(true)
{
CHECK:
for(auto& flag: ready_flags)
{
if(!flag)
goto CHECK;
}
draw();
finished_drawing = true;
}
}
void ProcessThread(int id)
{
while(true)
{
process();
finished_drawing=false;
ready_flags[id] = true;
while(!finished_drawing)
;
}
}
reserve
避免重新分配。或者,如果您事先不知道线程/互斥锁的数量,可以改用互斥锁的std::deque
或std::list
。问题可能是,您无法同时等待多个条件变量。但是这个问题是可以解决的,例如,通过引入一些(无锁)事件队列并伴随一个单一的条件变量。 - Daniel Langr