주요 차이점 

  1. 리턴 값이 다르다
  2. 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

반응형

+ Recent posts