C++ 一个线程等待多个线程事件

C++ 一个线程等待多个线程事件,c++,multithreading,C++,Multithreading,我有一个线程在等待来自不同数量的其他线程的事件,这些线程依赖于来自这一个线程的事件来继续处理。如何编写代码以避免繁忙的循环 更具体地说,我有多个线程处理各自的视频帧并将其写入屏幕缓冲区(在不同的位置)。在它们全部完成之后,一个线程将缓冲区发送到draw,然后这些线程等待draw调用完成,然后继续下一帧 这需要在C++中实现。所使用的C++标准不受限制。 编辑:std::condition\u变量似乎不是解决方案。因为它需要一个互斥体,并且线程(互斥体)的数量在运行时是已知的,所以我不能将互斥体放

我有一个线程在等待来自不同数量的其他线程的事件,这些线程依赖于来自这一个线程的事件来继续处理。如何编写代码以避免繁忙的循环

更具体地说,我有多个线程处理各自的视频帧并将其写入屏幕缓冲区(在不同的位置)。在它们全部完成之后,一个线程将缓冲区发送到draw,然后这些线程等待draw调用完成,然后继续下一帧

<>这需要在C++中实现。所使用的C++标准不受限制。 编辑:
std::condition\u变量
似乎不是解决方案。因为它需要一个互斥体,并且线程(互斥体)的数量在运行时是已知的,所以我不能将互斥体放入
std::vector

我的程序的伪代码如下所示:

drawThread:
    loop:
        for each processThread:
            wait for event
        draw()

processThread:
    loop:
        process()
        notify drawThread
        wait for draw to finish
编辑:我尝试的:

std::vector ready_标志;
标准::原子图完成图=假;
虚线
{
while(true)
{ 
检查:
用于(自动&标记:就绪\u标记)
{
如果(!标志)
转到检查;
}
draw();
完成的图纸=正确;
}
}
void ProcessThread(int-id)
{
while(true)
{
过程();
成品图=假;
就绪标志[id]=真;
而(!已完成图纸)
;
}
}

我在想一个可行的解决方案

const int processThreadCount;
std::原子就绪计数{};
std::共享互斥图形互斥;
std::条件变量任意可以绘制;
虚线
{
while(true)
{ 
std::unique_lock lk{drawing_mutex};
wait(lk,[&]{return ready_count==processThreadCount;};
draw();
就绪计数=0;
}
}
void ProcessThread(int-id)
{
while(true)
{
std::shared_lock lk{drawing_mutex};
过程();
++就绪计数;
可以画画。通知一个();
}
}

std::condition\u variable一个条件变量只需要一个互斥体。没有法律规定每个线程必须始终使用自己的互斥体。这样做实际上违背了互斥体的目的,因为互斥体被明确设计为可由多个线程访问。毕竟,互斥体就是这样的。互斥体guard针对任意数量的线程并发访问的数据。也就是说,您已经选择了工具(线程数量、通信方法),现在您遇到了问题。但是,也许您更应该描述目标,另请参见“XY问题”。你说你不能使用互斥体的向量。事实上,你只需要通过适当的
保留
来避免重新分配。或者,如果你事先不知道线程/互斥体的数量,你可以使用互斥体的
std::deque
std::list
。问题可能是,你不能等待多个条件变量但这个问题是可以解决的,例如,通过引入一些(无锁)事件队列,并附带一个条件变量。@DanielLangr您能根据我的情况详细说明一下吗?即使只是伪代码也很受欢迎。