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
电话。
我在 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
电话。