gpt4 book ai didi

c++ - 在 64 位字上进行 32 位比较和交换

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:09 28 4
gpt4 key购买 nike

假设我有一个 64 位字 (high32,low32),我对一个 32 位变量(比如 low32)执行了 __sync_val_compare_and_swap。如果两个线程同时尝试在 high32 和 low32 上进行 CAS,它们能否都成功?

最佳答案

在 Windows 64 位上,相邻整数上的 CAS 总是成功,无论对齐方式如何,也无论缓存行是否交叉(除非我的测试应用程序有错误)。我只测试了 Windows 7、64 位。

编辑:这可能就是 CAS 在所有现代英特尔芯片上的工作方式,无论操作系统如何。我在 I7 上运行。

#include <stdio.h>
#include <windows.h>

volatile __declspec(align(64)) char a[128];
int _nAlign = 0;

DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
auto iElem = (int)lpThreadParameter;
volatile auto* p = (int*)(a + _nAlign + sizeof(int) * iElem);
for (long long i = 0; i < 1000000000; ++i) {
int nOld = *p, nNew = nOld + 1;
if (InterlockedCompareExchange((DWORD*)p, (DWORD)nNew, (DWORD)nOld) != nOld)
return 1;
}
return 0;
}

int main(int argc, char* argv[])
{
if (argc == 2)
_nAlign = atoi(argv[1]);
HANDLE aThread[2];
for (int i = 0; i < 2; ++i) {
aThread[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)i, 0, NULL);
SetThreadAffinityMask(aThread[i], 1<<(2*i)); // hyperthreading is on, so make sure on actual separate cores
}
WaitForMultipleObjects(2, aThread, true, INFINITE);
DWORD aCode[2];
if (!GetExitCodeThread(aThread[0], &aCode[0]) || !GetExitCodeThread(aThread[1], &aCode[1]))
printf("GetExitCodeThread failed\n");
if (aCode[0] || aCode[1])
printf("CAS failed\n");
else
printf("CAS Succeeded\n");
return 0;
}

关于c++ - 在 64 位字上进行 32 位比较和交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38691554/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com