我对原子性的理解是,它用于确保一个值将被整体而不是部分地读取/写入。例如,实际上是两个 32 位 DWORD(此处假设 x86)的 64 位值在线程之间共享时必须是原子的,以便同时读取/写入两个 DWORD。这样一个线程就无法读取未更新的半变量。你如何保证原子性?
此外,据我了解,波动性根本不能保证线程安全。真的吗?
我已经看到它暗示了很多地方,简单的原子/易失性就是线程安全的。我不明白这是怎么回事。我是否还需要一个内存屏障来确保在实际保证在另一个线程中读取/写入之前读取/写入任何原子值或其他值?
因此,例如,假设我创建了一个挂起的线程,进行一些计算以将某些值更改为线程可用的结构,然后恢复,例如:
HANDLE hThread = CreateThread(NULL, 0, thread_entry, (void *)&data, CREATE_SUSPENDED, NULL);
data->val64 = SomeCalculation();
ResumeThread(hThread);
我想这将取决于 ResumeThread 中的任何内存障碍?我应该对 val64 进行联锁交换吗?如果线程正在运行,那会如何改变事情呢?
我确定我在这里问了很多,但基本上我想弄清楚的是我在标题中提出的问题:对 Windows 中的原子性、易变性和线程安全性的一个很好的解释。谢谢