Windows中的原子性、波动性和线程安全
我对原子性的理解是,原子性用于确保一个值被整体而不是部分地读/写。例如,一个64位值实际上是两个32位DWORD(此处假设为x86),在线程之间共享时必须是原子的,以便两个DWORD同时读取/写入。这样一个线程就不能读取半个未更新的变量。你如何保证原子性 此外,据我所知,波动性根本不能保证线程安全。这是真的吗 我已经看到它暗示了许多地方,简单的原子/易失性是线程安全的。我不明白这是怎么回事。我是否也需要一个内存屏障来确保任何值(原子值或其他值)在能够保证在另一个线程中读/写之前都已读/写 例如,假设我创建一个挂起的线程,进行一些计算,将一些值更改为线程可用的结构,然后继续,例如:Windows中的原子性、波动性和线程安全,windows,multithreading,thread-safety,atomicity,volatility,Windows,Multithreading,Thread Safety,Atomicity,Volatility,我对原子性的理解是,原子性用于确保一个值被整体而不是部分地读/写。例如,一个64位值实际上是两个32位DWORD(此处假设为x86),在线程之间共享时必须是原子的,以便两个DWORD同时读取/写入。这样一个线程就不能读取半个未更新的变量。你如何保证原子性 此外,据我所知,波动性根本不能保证线程安全。这是真的吗 我已经看到它暗示了许多地方,简单的原子/易失性是线程安全的。我不明白这是怎么回事。我是否也需要一个内存屏障来确保任何值(原子值或其他值)在能够保证在另一个线程中读/写之前都已读/写 例如,
HANDLE hThread = CreateThread(NULL, 0, thread_entry, (void *)&data, CREATE_SUSPENDED, NULL);
data->val64 = SomeCalculation();
ResumeThread(hThread);
我想这取决于恢复线程中的任何内存障碍?我应该为val64进行联锁交换吗?如果线程正在运行,会如何改变情况
我肯定我在这里问了很多问题,但基本上我想弄明白的是我在标题中问的:一个关于Windows中原子性、波动性和线程安全性的好解释。感谢
,一般来说,C和C++不提供关于如何在多线程程序中读写“易失性”对象的任何保证。(“新的C++ 11可能是因为它现在包含了线程作为标准的一部分,但是传统线程不是标准C或C++的一部分。”使用易失性,并假设代码中的原子性和缓存一致性是一个问题。一个特定的编译器和平台是否会以线程安全的方式处理对“易失性”对象的访问,这是一个废话
一般规则是:“volatile”不足以确保线程安全访问。您应该使用一些平台提供的机制(通常是一些函数或同步对象)来安全地访问线程共享值 现在,特别是在Windows上,特别是在VC++2005+编译器上,特别是在x86和x64系统上,访问基本对象(如int)可以实现线程安全,前提是: