有没有办法将程序限制到一个CPU而不关心哪一个?

时间:2011-06-28 21:30:20

标签: .net multithreading multiprocessing

我有一个偶尔会出现故障的程序,我想知道这些问题是否与运行在不同核心上的不同线程有关,处理读写的顺序不同(我知道x86内存模型需要不同的内核来做事情大多数情况下是预期的,但在某些情况下,读取和写入无法在单个CPU上重新排序,但可能在多核系统上重新排序。将处理器亲和性设置为某些特定选择的任意CPU核心似乎不是一个好主意(如果该核心发生繁忙,没有理由所有线程都不能迁移到其他核心,只要有一个完整的缓存先冲洗)。有没有办法简单地指示所有线程必须在同一个核心上运行,但我不关心它是哪一个?

PS - 我的理解是,如果一个线程将一些数据写入类实例,然后对类引用执行CompareExchange(因此引用将指向新修改的实例),这意味着实例的所有更改都将在类引用之前写入内存;在使用该类引用的同一CPU上的另一个线程上运行的代码将使用类引用的旧值或将看到对该实例所做的更改;但是,在其他CPU上运行的代码可能会在某些棘手的情况下看到类引用的新值,但看不到写入实例的新数据。我的理解是错误的吗?

1 个答案:

答案 0 :(得分:6)

不,这也无法解决您的问题。即使在单核上,操作系统也可以随时重新安排您的程序,从而导致同样的问题。您可能能够使问题不太可能发生 - 但这只是意味着问题,当它不可避免地出现在现场时,将会更难调试。现在修复你缺乏锁定,然后再咬你。

更具体地说,没有Windows(或Linux)功能告诉操作系统,“将我的所有线程都放在同一个核心上”。您可以告诉操作系统将它们全部保存在某些特定的核心上,但您不能让它像那样浮动。由于内存屏障相对便宜,因此最好以正确的方式实现它们。即使锁定操作在现代处理器上也相对便宜 - 当CPU开始读取操作部分时(无论如何必须在任何写入时),CPU只是在高速缓存行上获得锁定并且拒绝释放锁定,直到锁定的操作完成。