【问题标题】:how to make atomic instruction如何制作原子指令
【发布时间】:2014-07-26 23:00:35
【问题描述】:

在多线程中,如果多个线程改变一个全局变量的值,(指令在执行过程中)像这样:

 value:=value+1;

肯定这个必须是原子指令,那么我应该在我的代码中添加什么来使这个指令成为原子指令?

【问题讨论】:

  • value 变量的类型是什么?
  • 对于原子增量(您已在代码中显示)使用TInterlocked.Increment。还有其他功能,如TInterlocked.Decrement 用于递减,或TInterlocked.Exchange 用于价值交换等。
  • 处理这种情况的另一种方法是首先避免共享。停止使用全局变量。将变量保持在本地。有时你需要分享,但如果可以避免,通常应该避免。
  • 好的,在这种情况下我需要分享一下,是否有另一个函数可以使任何指令原子化,而不仅仅是递增,我该如何接受答案,我该怎么办?
  • 您不能使任何指令原子化。只有那些可以合理实施的。 AtomicXXX 系列是具有硬件支持的系列。对于更复杂的操作,您需要使用锁。

标签: multithreading delphi synchronization atomic


【解决方案1】:

在现代 Delphi 中,您应该使用内部函数 AtomicIncrement。 RTL 中有一整套这样的函数提供原子操作。例如原子交换、原子比较和交换等。

对于你的代码,你会写:

AtomicIncrement(value);

使用内部函数的好处是编译器在调用站点内联 asm 指令。

在旧版本的 Delphi 中,您应该使用 InterlockedIncrement。同样,还有一系列类似命名的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-12-16
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多