Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+测试对基本数据类型的同步锁定需求+;_C++_C_Multithreading_Synchronization - Fatal编程技术网

C++ 使用C+测试对基本数据类型的同步锁定需求+;

C++ 使用C+测试对基本数据类型的同步锁定需求+;,c++,c,multithreading,synchronization,C++,C,Multithreading,Synchronization,我在这个论坛上看到很多线程都在处理这样一个问题:当从多个线程访问基本数据类型时,我们是否需要使用同步: 所以我写了一个小测试来验证这一点: 我在英特尔(R)核心(TM)i7 CPU 860@2.80GHz上运行了一个多小时,运行时有4个物理核心: #define MULTIPLIC_VAL 17 DWORD gdwSharedVal01 = MULTIPLIC_VAL; DWORD WINAPI thread001(LPVOID lpParameter); //Begin threads

我在这个论坛上看到很多线程都在处理这样一个问题:当从多个线程访问基本数据类型时,我们是否需要使用同步:

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

我在英特尔(R)核心(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;
}
#定义多重值17
DWORD gdwSharedVal01=多重值;
DWORD WINAPI thread001(LPVOID lpParameter);
//开始线程
对于(int i=0;i<30;i++)
{
德沃德·德维德;
句柄hThread=::CreateThread(NULL、0、thread001、NULL、0和dwThreadId);
if(hThread)
{
::CloseHandle(hThread);
}
其他的
{
_tprintf(L“错误:CreateThread错误%d\n”,::GetLastError());
}
}
//等等
getchar();
BOOL checkSharedValue()
{
//返回:
//=如果值正常,则为TRUE
如果((gdwSharedVal01%multipli_VAL)==0)
{
返回TRUE;
}
返回FALSE;
}
DWORD WINAPI线程001(LPVOID lpParameter)
{
srand((UINT)time(NULL));
DWORD dwThreadID=::GetCurrentThreadId();
_tprintf(L“线程%d已开始…\n”,dwThreadID);
对于(;;)
{
//设定值
DWORD v=兰德();

v在Intel中,对对齐字的读写是原子操作(原子的意思是其他处理器将看到原始值或新值)


请注意,这并不意味着您不应该提供同步机制。此测试用例中线程只需将新值写入并读取到同一变量中。如果它们提供的某种操作涉及更新的读/写操作,则可能会失败(假设10个线程将变量增加100,最后的变量可能没有总共增加1000!)并且没有其他变量(编译器/cpu重新排序可能会导致其他问题)有些处理器,x86是一个领先的例子,它比其他处理器保证了更多的多线程程序,或者比C或C++标准需要的更多。我会解释说,有时候,未定义的行为的结果是按照你的期望去做。好的,显然,如果同一个线程试图从我的代码> GDWSRADDV中读取。al01
变量更新后,它将不会有相同的值。我主要关心的是原语类型本身的完整性(每个操作)那么,比方说,如果我确定我的代码将运行在x86/x64 Windows only机器上,Windows XP和更高版本,我可以安全地跳过我上面给出的示例的同步吗?@c00000fd:这个特定的示例会起作用。增加最小的复杂性,它很可能会失败。是否将
int
初始化为0并设置为仅当唯一共享状态为
int
时,由一个线程到一个有效的同步机制。