2013-05-15 1 views
3

원자 적으로 수행 할 수 있습니까? 원자 저장소가 XCHG [addr], EAX으로 수행해야합니다원자 적으로로드하여 X86 프로세서에 저장할 수 있습니까?

void load_and_store(int* dst, int* src) { 
    int data = *src; 
    *dst = data; 
} 

경우, 내가 먼저 EAX로 데이터를로드 할 것입니다. 그런 다음로드 및 저장은 원자 적이지 않습니다.

gcc 원자 확장은 void __atomic_store (type *ptr, type *val, int memmodel)이며 원자 적으로로드 및 저장을 모두 수행 할 수있는 것처럼 보입니다.

+0

'* dst = * src; '와 다른가요? –

+0

* dst = * src는 원 자성이 아닙니다. – woodings

+0

@ MarkB 아마도 내 질문은 약간 혼란 스러웠습니다. 원자적인 방식으로 C++의 함수와 같은 일을하는 CPU 명령어가 있는지 궁금합니다. – woodings

답변

6

로드 및 저장소를 원자 적으로 다른 주소로 바꾸는 x86에 대한 지침이 없다고 생각합니다. (다른 아키텍처에 대해서는 잘 모르겠지만, 그럴만 한 가치가있는 것은 의심의 여지가 있습니다. 유용한 가치가없고 값 비쌉니다.)

x86 및 x86_64는 원자 읽기 수정 - 쓰기 작업 을 수행 할 수 있지만 단일 메모리 위치에만 수행 할 수 있습니다. 예를 들어, BTS은 테스트 및 설정을 수행합니다. XCHG은 레지스터의 값을 메모리 위치의 값과 교환합니다. XADD은 원자 증분을 수행합니다. CMPXCHG 비교 및 ​​교환을 수행합니다. 이들 중 어느 것도 기본적으로 원자가 아니지만 접두어 LOCK을 어셈블리 명령어에 추가하여 원자 적으로 만들 수 있습니다.

gnu __atomic_store(type *ptr, type *val, int memmodel)은 당신이 생각하는대로하지 않습니다. http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html을 참조하십시오. 그것이하는 것은 레지스터 (또는 무엇인가 (val로 무엇을하는지는 실제로 정의되지 않았다))에 val을로드 한 다음 ptr에 의해 주어진 메모리 위치에 값을 원자 적으로 저장하는 것입니다.

x86 에 정렬로드 및 저장 (32 비트 이하의 값)은 기본적으로 원자입니다.

그러나 gnu 내장 함수를 사용해야하는 경우가 아니면 사용해서는 안됩니다. 대신 --std=c++11 플래그를 사용하고 the C++ atomics을 사용하십시오.

관련 문제