2009-09-19 20 views
1

InterlockedIncrement如何工作?InterlockedIncrement vs. ++

只有在多处理器系统上才会关注吗?

它是做什么的,禁用所有处理器中的中断?

+0

你在说.NET或其他语言/平台吗? – 2009-09-19 14:03:35

+0

@MatthewScharley我想他不是。他会提到互锁类(Interlocked *函数的托管包装),而不是InterlockedIncrement。 – mg30rg 2015-06-03 11:40:30

回答

2

jcopenha是正确的,但我只是想回答“是否只关注多处理器系统?”

我不知道你在用哪个Interlocked。如果你的意思是C++,那么在单核上,如果x不大于“bitness”,你应该“安全地”做“++ x”。我编写的“应该是”,因为编译器可以在函数中以某种奇怪的方式对其进行优化 - 例如在完全不同的地方将两个“++ x”更改为普通的“add ...,2”,并且一些多线程逻辑可能因此而失败。在多核上,甚至在32位x上的++ x可能会有奇怪的效果(指令可以是“inc mem”或“lock inc mem”,并且当您未锁定时从两个cpus增加一个mem地址时,得到奇怪的结果)。

如果你的x的“bitness”高于你的cpu,那么你需要在任何多线程代码中互锁 - 无论它是单核还是多核都无关紧要,因为该指令必须编译成两个asm代码并且上下文切换可能发生在两者之间。 (这可以通过RCU修复)

在.NET中它基本上是一样的故事,但是你已经重载Increment,而不是Interlocked ...和Interlocked ... 64。

所以是的 - 只要你写多线程的东西(即使在单核上),只需在共享内存上使用互锁增量。这里不值得比机器更“聪明”。

+0

我得到岸上的“应该做的”部分,因为你永远不知道它是否会在多核系统上运行。 另外,根据x的位置以及cpu的功能,x ++将解析为不同的机器代码。我正在考虑增加寄存器的情况,但这只是编译器可以实现的一种可能的方式。它可能最终成为读取内存,增量,写入内存。这肯定不是原子的。 试着将这回转换回嵌入式8位AVR和ARM世界,我习惯了。 – JeffV 2009-09-20 16:06:02

4

InterlockedIncrement通过使用机器级指令以原子方式增加和存储一个值。意味着在此过程中不能对数值和存储位置执行操作。

任何时候多个线程或进程或访问相同的值都值得关注。因此,多线程应用程序中的共享变量或多个进程的共享内存。

我不相信该指令禁止中断,至少在x86类型的硬件上。

+1

相反,只要你的应用程序是多线程的,你所运行的系统并不重要,那么你需要担心。但是,在一个运行在多处理器系统上的单线程应用程序中,反过来并不是真的,但仍然不需要担心。 – 2009-09-19 14:06:52

+0

在多进程上下文中稍微提到了多线程和共享内存。 – jcopenha 2009-09-19 14:11:29

+0

我认为这个问题提到了多处理器系统(带有多个独立的处理器)。 AFAIK InterlockedIncrement()也适用于这种情况,但我不知道它是如何实现的(因为锁定指令仅在其中一个处理器上运行)。 – mg30rg 2015-06-03 11:43:10

相关问题