据我理解,原子性用于确保值被整体读取/写入,而不是部分读取/写入。例如,在线程之间共享的64位值实际上是两个32位DWORD(假设在x86平台上),必须是原子的,这样两个DWORD将同时被读取/写入。这样就可以防止一个线程只读取到变量的一半,而未更新另一半。如何保证原子性?
此外,据我所知,易变性根本不能保证线程安全。这是真的吗?
我看到很多地方都暗示仅仅具有原子性/易变性就是线程安全的,但我不明白其中的道理。难道我不需要内存屏障来确保任何值,无论是否具有原子性,都在其被读取/写入到另一个线程之前进行读取/写入吗?
例如,让我们假设我创建了一个挂起的线程,对可用于该线程的结构进行了一些计算以更改某些值,然后恢复它,例如:
HANDLE hThread = CreateThread(NULL, 0, thread_entry, (void *)&data, CREATE_SUSPENDED, NULL);
data->val64 = SomeCalculation();
ResumeThread(hThread);
我想这取决于ResumeThread中是否有任何内存屏障? 我应该对val64进行交错交换吗? 如果线程正在运行,那会改变什么?
我知道我在这里问了很多问题,但基本上我想弄清楚的是标题中所问的:Windows中原子性,易失性和线程安全的良好解释。谢谢