如何确定所有线程何时完成执行?

本文关键字:执行 何时完 线程 何确定 | 更新日期: 2023-09-27 18:05:18

我有一个体系结构,它从打包的二进制文件中读取数据包,根据数据包类型将每个数据包分配给单独的处理管道,并在管道的另一端将数据包重新组装成一个新文件。每个管道都包含与此类似的阻塞队列。

在每个管道阻塞队列的每一侧都有一个线程,该线程运行一个循环来对数据包进行排队或脱队。这些线程是异步启动的(即:"即发即弃"(fire and forget)风格)。这个控制器对象有一个Dictionary<int, ChannelPipeline>集合,它包含了所有的管道对象。

这是我的问题:我可以设置什么机制来告诉我所有的管道何时完成处理?每个管道上都有一个EndOfData属性;我是否必须在每个管道上连续轮询该属性,直到它们都读取true,或者是否有更好(即更有效)的方法?

如何确定所有线程何时完成执行?

如果您知道管道的总数,您可以考虑AutoResetEvent +整数计数器

AutoResetEvent allThreadsDone = new AutoResetEvent(false);
int completedThreads;
int scheduledThreads;

基本上每个工作线程将增加它的值使用Interlocked.Increment()和设置事件,如果它是最后一个线程:

Interlocked.Increment(ref completedThreads);
if (completedThreads == scheduledThreads)
{
    allThreadsDone.Set();
}

在监视线程中,您只需执行:

 allThreadsDone.WaitOne();
   // here is we know that all threads are finished