多线程应用程序中的非解剖学分配

时间:2014-01-09 15:01:30

标签: c++ multithreading winapi

在多线程项目中分配值时,我是否应始终关注原子性?我有两个并行运行的线程。如果仅用作标志,我可以安全地更改非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更改时才会观察到该标记。

1 个答案:

答案 0 :(得分:1)

你必须使用Interlocked*函数或(更好的)C ++ 11原子。