C#在继续之前等待来自所有线程的信号

时间:2016-12-14 09:05:05

标签: c# multithreading synchronization

我正在编写一个C#程序,它涉及多线程之间的多线程和同步。线程都需要独立执行一些迭代工作,并且在一些线程完成指定的迭代次数之后,它必须等待其他线程出现。在完成所有迭代次数并获得一些中间结果之后,它们应该进行一些同步工作,然后再次继续执行,直到达到另一个同步点,依此类推。

这是我尝试实现这一目标(一个线程应该在一次迭代后暂停,然后等待其他迭代):

@Configuration
@ComponentScan(value = { "controllers", "services", "listeners" })
@Import(value = { ThymeleafConfig.class, i18nConfig.class, CustomFlashMessagesConfigurer.class })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter

但上面的代码似乎不起作用,因为没有任何线程等待其他线程的所有由于某种原因执行一次迭代。我想我误解了ManualResetEvent的用途或者用错了方法,你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您的代码很容易出现竞争条件。在所有线程完成第一次迭代后,仍然设置所有事件;如果一个线程然后在其他人重置他们的事件之前运行循环,它将看到其他事件仍然设置,并且停止提前等待。

有很多方法可以解决此问题,但最适合您的解决方案是System.Threading.Barrier。它是为这种情况明确设计的,您希望多个线程通过多步算法并行工作。