繁体   English   中英

保证唤醒所有线程,每个线程仅唤醒一次

[英]guaranteeing to wake up all threads and only once per each

我在程序中发现一个错误,即同一线程被唤醒两次,从而有机会运行另一个线程,从而导致了意外的行为。 在我的程序中,所有等待线程每转应准确运行一次。 发生此错误是因为我使用信号量使线程等待。 与数0初始化的信号,每一个线程调用down在其无限循环的开始的信号,并且主线程调用up一个for循环NThreads (线程数)次。 有时,同一线程两次执行up调用,从而出现问题。

如何正确处理此问题? 使用条件变量并进行广播的方式吗? 是否可以保证每个线程都只能唤醒一次? 还有哪些其他好的方法呢?

在Windows上,可以使用WaitForMultipleObjects从当前Nthread迭代中尚未运行的线程中选择一个就绪线程。

每个线程都应该有一个“就绪”事件来通知它何时准备就绪,并有一个“唤醒”事件在其发出“就绪”事件信号后等待。

在主线程循环的开始(NThreads迭代的第1个)开始时,请使用您的NThreads“就绪”事件数组调用WaitForMultipleObjects

然后将线程的“ wake”事件设置为与WaitForMultipleObjects返回的“ ready”事件相对应,并将其从“ ready”句柄数组中删除。 这样可以确保已经运行的线程不会在下一次迭代时由WaitForMultipleObjects返回。

重复直到最后一次迭代,在该迭代中,您将使用仅包含一个线程句柄的数组来调用WaitForMultipleObjects (我认为这就像您调用WaitForSingleObject一样有效)。

然后为下一个新的Nthreads迭代重新填充NThreads“就绪”事件的数组。

好吧,使用一组信号量,每个线程一个。 如果您希望线程数组仅运行一次,请向每个信号量发送一个单元。 如果您希望所有线程都精确运行N次,请向每个信号量发送N个单元。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM