주요 차이점
- 리턴 값이 다르다
- 128 비트를 사용하는가, 64 비트를 사용 하는가가 다르다
BOOLEAN InterlockedCompareExchange128(
[in, out] LONG64 volatile *Destination,
[in] LONG64 ExchangeHigh,
[in] LONG64 ExchangeLow,
[in, out] LONG64 *ComparandResult
);
Parameters
[in, out] Destination
비교할 값
[in] ExchangeHigh
덮어쓸 상위 비트
[in] ExchangeLow
덮어쓸 하위비트
[in, out] ComparandResult
비교 대상이 되는 값
설명 :
Destination과 ComparandResult 를 비교해서 이 둘이 같다면
ExchangeHigh:ExchangeLow 이 값을 Destination에 덮어 씁니다
Return value
InterlockedCompareExchange128
이 함수 자체의 리턴 값은 Destination과 ComparandResult 를 비교하여 같다면 1 을 리턴하고 같지 않다면 0을 리턴합니다
Remarks
주의할 점은 같다면 설명 : 처럼 동작하는데 그렇지 않다면 Destination 은 수정 되지 않은 체 그대로 남아 있게됩니다
그리고 이때 ComparandResult 에는 original Destination value(에 첫번째 인자인 destination 값) 값으로 저장 됩니다
파라미터들은 16 바이트 aligned 된 상태여야 합니다, 그렇지 않으면 예측되지 않은 동작을 하게 됩니다
See _aligned_malloc.
이 함수는 (당연히) atomic 하게 동작하고 컴파일러 내장을 하용하면서 x64 시스템에서 동작합니다
이 함수는 메모리 장벽(memory barrier 또는 fence) 를 사용합니다 , 연산의 순서적 처리를 보장하기 위해서
#include <stdio.h>
#include <intrin.h>
#include <iostream>
#include <Windows.h>
#include <winnt.h>
#include <mutex>
#include <atomic>
#define WIN32_LEAN_AND_MEAN // 거의 사용되지 않는 내용을 Windows 헤더에서 제외합니다.
using namespace std;
typedef struct t_node
{
volatile __int64 arr[2];
}node;
int main()
{
node* a = new node();
a->arr[0] = 100;
a->arr[1] = 1;
__int64 i = 200;
__int64 j = 500;
volatile __int64 arr2[2] = {300,1};
char r = ::InterlockedCompareExchange128((__int64*)a->arr, i, j, (__int64*)(arr2));
cout << endl << "Interlocked Compare Res: " << r;
cin.get();
return 0;
}
LONG64 InterlockedCompareExchange64(
[in, out] LONG64 volatile *Destination,
[in] LONG64 ExChange,
[in] LONG64 Comperand
);
이건 위에 것 보다 쉬운데
Destination 과 Comperand
두개를 비교해서 같다면 ExChange 를 Destination 에 저장합니다
만약 같지 않다면 아무 동작을 수행하진 않습니다
이것을 사용하려면 64비트 로 정렬 되어 있어야 합니다 만약 그렇지 않으면 예측 되지 않은 동작을 하며 x86 멀티 프로세스 그리고 x86 시스템이 아닌 어떤 곳에서 예측되지 않은 동작을 하게 됩니다
Return value
리턴 값은 Destination 의 초기 값을 리턴합니다
https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-interlockedcompareexchange64
https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-interlockedcompareexchange128
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
MemoryPool 3 (MS-lock-free stack, ABA 문제 해결방안 128bit) (0) | 2022.10.13 |
---|---|
MemoryPool 2 (포인터와 인덱스 값으로 ABA 문제 해결방안 128bit) (0) | 2022.10.11 |
lock-free aba problem (0) | 2022.10.10 |
MemoryPool (0) | 2022.10.10 |
Stomp allocator, STL allocator - VirtualAlloc (0) | 2022.10.08 |