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

Posted

技术标签:

【中文标题】多线程应用程序中的非解剖分配【英文标题】:Non-atomical assignement in multi-threaded applications 【发布时间】:2014-01-09 15:01:30 【问题描述】:

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

【问题讨论】:

不,不安全。您需要使用某种互锁 - 临界区、信号量等。 ***.com/q/8290768/535275 @OldProgrammer 谢谢。但是为什么我不需要一个确切的值呢? 【参考方案1】:

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

【讨论】:

谢谢。我做了一点更新。如果两个线程中只有一个线程更改变量而其他线程观察,我是否仍需要使用锁? 是的。任何时候你有一个写并发任何东西,你需要原子。 (或使用锁使其不并发。) 哪个更好用:microsoft interlocked functions 还是 c++11 atomics? 原子。它们具有更明确定义的语义,使程序员和编译器都更容易推理(这有利于优化)。它们也是便携式的,这可能对您将来很重要。

以上是关于多线程应用程序中的非解剖分配的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程编程

Java 多线程编程

Java多线程

多线程入门

深入浅出Java多线程

基于多线程的非阻塞 socket 编程