如何确定所有线程何时完成执行?
本文关键字:执行 何时完 线程 何确定 | 更新日期: 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