在多线程项目中分配值时,我是否应始终关注原子性?我有两个并行运行的线程。如果仅用作标志,我可以安全地更改非DWORD变量吗?或者我必须使用DWORD对齐变量(或DWORD本身),因为Microsoft保证它将以原子方式更改?或者我是否必须减慢代码并使用Interlocked *()函数?如果我从32位系统转到16位系统或从32位系统升级到64位系统,我的代码是否仍能正常工作?
/* real value doesn't matter, only null or not-null */
short flag;
// DWORD flag;
DWORD WINAPI thread_1(LPVOID* param)
{
while(true){/* do stuff, flag can be changed non-atomically */}
return 0;
}
DWORD WINAPI thread_2(LPVOID* param)
{
while(true){if(flag){/* do stuff */}}
return 0;
}
更新
thread_2
仅在thread_1
更改时才会观察到该标记。
答案 0 :(得分:1)
你必须使用Interlocked*
函数或(更好的)C ++ 11原子。