如何在C / C ++中实现确定性多线程?

时间:2014-08-28 06:59:19

标签: c++ c multithreading

众所周知,线程作为计算模型是非确定性的。但是,在某些情况下,我们希望通过多线程并行计算来利用性能提升,同时保持执行的确定性,以便轻松满足一些常规需求,例如调试或某些特定需求。我知道有可能为特定任务实现确定性多线程,但我期待一种通用且优雅的方式(也就是说,不需要大量繁琐的工程工作)来实现C / C ++中的任务。解决方案的类型无关紧要:可以通过某些库,某些平台,某些通用方法或任何其他方式来实现它。

2 个答案:

答案 0 :(得分:7)

你以与可变常数相同的方式实现确定性多线程 - 你不会。

相反,您使用各种形式的同步(包括互斥,信号量,条件变量,信号等)来确保从非确定性代码中获得确定性结果(如果需要)。当然,您使用的同步越多,从代码中获得的并行性就越少;所以你只想要最小的同步。

如何做到这一点取决于确切的算法 - 没有"银弹"这是进行同步的最佳方式,适用于所有截然不同的问题。

答案 1 :(得分:4)

如果您想要调试确定性,可以尝试使用Microsoft Research的{​​{3}}:

  

CHESS是一种同时发现和复制Heisenbugs的工具   程式。 CHESS反复运行并发测试,确保每一个   run需要不同的交错。如果交错产生一个   错误,CHESS可以重现交错以改进调试。   CHESS适用于托管和本机程序。