InterlockedExchange 是否应该用于变量的所有设置?

Should InterlockedExchange be used on all setting of a variable?

我在 Windows 中使用 InterlockedExchange,我有两个问题放在一起基本上就是我的标题问题。

InterlockedExchange 使用 LONG 类型(32 位)。根据 Microsoft 的文档 Interlocked Variable Access: "simple reads and writes to 32-bit variables are atomic operations without InterlockedExchange". According to function documentation InterlockedExchange“此函数相对于对其他互锁函数的调用是原子的”在没有联锁函数的情况下,read/write LONG 在 Windows 中是否是原子的?

我正在审查一些代码,其中一个线程设置一个变量,然后该线程或它创建的任意数量的线程使用 InterlockedExchange 对该变量进行所有进一步访问。为了简单起见,考虑线程 运行 main() 创建一个线程 运行 other():

LONG foo;

main()
{
  foo = TRUE;
  createthread(other());
  /* do other things */
  if(InterlockedExchange(&foo, 0))
  {
     cleanup()
  }
}

other()
{
  /* do other things */
  if(InterlockedExchange(&foo, 0))
  {
     cleanup()
  }
}

cleanup()
{
/* it's expected this is only called once */
}

在这个例子中是否有可能 foo 不会对任何一个 InterlockedExchange 调用显示为 TRUE? 如果 main 正忙于做其他事情,那么第一个 InterlockedExchange调用是从另一个线程发出的,这是否意味着 foo 保证已由主线程写入并且当时对另一个线程可见?

抱歉,如果不清楚,我不知道如何更好地表达它。

Is it or is it not atomic to read/write a LONG in Windows without the interlocked functions?

两者都是,假设默认对齐。这是从引用的语句“正确对齐的 32 位变量的简单读取和写入是原子操作”得出的,因为 LONG 在 [=51 中是 a 32-bit signed integer =],无论 OS.

的位数如何

Is it possible in this example that foo will not appear TRUE to either of the InterlockedExchange calls?

不,如果两个 呼叫都已接通,则不可能。这是因为在单个线程中,foo = TRUE; 写入保证对其后的 InterlockedExchange 调用可见。因此 main 中的 InterlockedExchange 调用将看到先前在 main 中设置的 TRUE 值,或者 other 线程中重置的 FALSE 值.因此,InterlockedExchange 调用之一必须将 foo 值读取为 TRUE

但是,如果 main 中的 /* do other things */ 代码是一个无限循环 while(1);,那么 other 中将只留下一个未完成的 InterlockedExchange,并且出于与...

相同的原因,该调用 可能 foo 视为 FALSE

If main is busy doing other things so that the first InterlockedExchange call is made from the other thread, does that mean foo is guaranteed to have been written by the main thread and visible to the other thread at that time?

不一定。 foo = TRUE; 写入在创建辅助线程时对 main 线程可见,但在 other 线程启动时或什至到达时不一定对 other 线程可见InterlockedExchange 电话。