2009-05-30 8 views
11

원자 (double) 비교 및 ​​교체 명령어를 사용하여 잠금없는 메커니즘을 구현하고 있습니다. cmpxchg16b잠금 해제 구조에 대한 C++ 원자 연산

현재 어셈블리에서 이것을 작성하고 연결하고 있습니다. 그러나 자동으로 컴파일러를 얻는 방법이 있는지 궁금합니다. 예 : 서라운드 코드 블록을 '원자 적으로'구현하고 기본 프로세서 아키텍처에서 원자 명령어로 코드를 구현하는 방법을 설명합니다 (또는 기본 아치가 지원하지 않으면 컴파일시 오류가 발생합니다).

P. 내가 GCC는 원자 작업을 & C를 지원하는 C++에 대한

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins

답변

11

이미 대답했습니다. here입니다.

C++ 0x 표준은 std :: atomic <> 템플릿을 사용하여 주로 정수 및 void 유형 인 atomic datatypes을 제공합니다. 그 기사는 오늘 다운로드하여 사용할 수있는 Boehm's atomic_ops project에 대해 언급합니다.

그렇지 않다면 컴파일러에서 어셈블러 인라인을 구현할 수 없습니까? MSVC는 인라인 어셈블러 루틴에 대해 __asm 키워드를 가지고 있습니다. Google은 yes, gcc can do it too라고 말합니다.

+8

MSVC에는 연동 연산이 포함되어 있으며 GCC에는 원자 연산 함수가 내장되어 있으므로 인라인 어셈블러를 수행 할 필요가 없습니다. 컴파일러 래퍼를 사용하면 컴파일러가 지원하는 모든 플랫폼에서 이식성을 유지할 수 있습니다. – bdonlan

+0

MSVC에는 긴 데이터 유형에 대해서만 연동 연산이 있으며 OP는 두 배로 늘려야합니다. – gbjbaanb

+0

gcc에는 DWCAS에 대한 기본 제공 작업이 없습니다. MSVC에는 DWCAS가 내장되어 있습니다. 증분, 감소 등을위한 DW (더블 워드, 예를 들어, 2 개의 포인터 길이, 나란히) - DW는 오직 존재하고 단지 CAS에 대해서만 존재하며 유일한 존재이다. –

5

미래를 "C++ 0X"표준 (적어도 CAS에 대한) 일부 내장 기능을 가지고 있음을 알고있다 - 예를 들어, 참조 합리적으로 토의 한 토론을 위해 http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html. 앞서 언급 된 표준이 승인되고 광범위하게 구현 될 때까지는 컴파일러간에 "이동 가능"하게 이러한 기능을 구현할 수있는 방법이 없습니다. gcc 이외의 특정 컴파일러에 관심이 있다면 아마도 다른 질문을 열 수도 있습니다.

+0

내가 뭔가를 놓치고 있는지 확실하지 않지만 연결된 문서가 관련성이없는 것 같습니다. – bugmenot77

+0

맞습니다. 잘못된 URL을 붙여 넣습니다. 수정하여 수정 해주세요. 감사합니다! –