gpt4 book ai didi

c++ - 使用 C++ 测试对原始数据类型同步锁的需求

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:08 25 4
gpt4 key购买 nike

我在这个论坛上看到很多线程都在处理从多个线程访问原始数据类型时是否需要使用同步的问题:Question 1 , question 2 , question 3 , question 4 ...

所以我写了一个小测试来验证这一点:

我在我的 CPU Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz 上运行了一个多小时,它有 4 个物理内核:

#define MULTIPLIC_VAL 17

DWORD gdwSharedVal01 = MULTIPLIC_VAL;

DWORD WINAPI thread001(LPVOID lpParameter);

//Begin threads
for(int i = 0; i < 30; i++)
{
DWORD dwThreadId;
HANDLE hThread = ::CreateThread(NULL, 0, thread001, NULL, 0, &dwThreadId);
if(hThread)
{
::CloseHandle(hThread);
}
else
{
_tprintf(L"ERROR: CreateThread error %d\n", ::GetLastError());
}
}

//Wait
getchar();


BOOL checkSharedValue()
{
//RETURN:
// = TRUE if value is OK
if((gdwSharedVal01 % MULTIPLIC_VAL) == 0)
{
return TRUE;
}

return FALSE;
}


DWORD WINAPI thread001(LPVOID lpParameter)
{
srand((UINT)time(NULL));

DWORD dwThreadID = ::GetCurrentThreadId();
_tprintf(L"Thread %d began...\n", dwThreadID);

for(;;)
{
//Set value
DWORD v = rand();
v <<= 16;
v ^= rand();

v = v / MULTIPLIC_VAL;
gdwSharedVal01 = v * MULTIPLIC_VAL;

//Check value
if(!checkSharedValue())
{
//Failed
_tprintf(L"FAILED thread %d\n", dwThreadID);
}
}

return 0;
}

而且我没有失败。那你怎么解释呢?

最佳答案

在 Intel 中,对对齐字的读取和写入是原子操作(原子操作是指其他处理器将看到原始值或新值)。

请注意,这并不意味着您不应该提供同步机制。在这个测试用例中,线程只是将新值写入和读取到同一个变量中。如果他们提供某种涉及更新读/写的操作,它可能会失败(比如 10 个线程将变量递增 100,最后的变量可能不会总共递增 1000!)并且没有其他变量在起作用(编译器/CPU 重新排序可能会导致其他问题)。

关于c++ - 使用 C++ 测试对原始数据类型同步锁的需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21319903/

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