2016-08-01 2 views
1

64 비트 워드 (high32, low32)가 있다고 가정하면 32 비트 변수 (예 : low32)에서 __sync_val_compare_and_swap을 수행한다고 가정 해보십시오. 두 스레드가 동시에 high32에서 CAS를 시도하고 low32에서 둘 다 성공할 수 있습니까?64 비트 워드에서 32 비트 비교 및 ​​스왑

+0

나는 downvote를 이해하지 못합니다. 인접한 2 개의 __int32가 간섭 하는지를 아는 것이 좋을까요? 동일한 캐시 라인을 점유하지 않으면 방해를합니까? 나는 모든 것이 정렬되어야한다고 가정하지만, 그렇지 않다면 두 개의 인접한 정렬되지 않은 __int32가 간섭을 일으킬 것입니다. – johnnycrash

+1

@johnnycrash : 오늘 하루가 더 심해지고 있습니다. 최소한 무언가를 downvoting하는 경우 사람들은 코멘트를 남기도록 강요 할 필요가 있습니다. – arunmoezhi

+0

아무도 답변이 없습니다. 무한 루프에서 각각 하나의 int에서 CAS를 사용하는 두 개의 쓰레드로 이것을 테스트 할 수 있습니다. CAS가 실패했는지 확인하십시오. – johnnycrash

답변

2

windows 64 비트에서 인접한 int에있는 CAS는 정렬에 관계없이 그리고 캐시 라인이 교차 되더라도 (내 테스트 앱에 버그가없는 한) 항상 성공합니다. 나는 윈도우 7, 64 비트만을 테스트했다.

편집 : 이것은 CAS가 OS와 상관없이 모든 최신 Intel 칩에서 작동하는 방법입니다. 나는 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; 
} 
+0

감사합니다. 나는 CAS가 모두 성공할 것이라고 추측했다. 하지만 캐시 통계를 기록하여 캐시 미스가 발생하는지 확인합니다. – arunmoezhi