문제

C ++ Linux 앱에서 연동 Win32의 기능이 제공됩니까? 구체적으로, 32 또는 64 비트 정수를 원자 적으로 증가 시키거나 추가하는 가벼운 방법?

도움이 되었습니까?

해결책 7

추가 검토시 이것 유망한 것 같습니다. 예이 스택 오버플로.

다른 팁

인텔의 오픈 소스 ThreadBuildingBlocks .NET의 인터 로크 클래스와 동일한 기능을 제공하는 템플릿 인 Atomic이 있습니다.

GCC의 원자 내장과 달리 크로스 플랫폼이며 특정 컴파일러에 의존하지 않습니다. Nemanja Trifunovic가 위에서 올바르게 지적한 것처럼, 그것은 비교-스왑 X86 및 Itanium 칩이 제공하는 CPU 명령. 인텔 도서관에서 다른 것을 기대하지 않을 것 같아요 :)

아무 관련이없는 문제를 명확히하기위한 메모는 거의 없습니다. 리눅스.

RWM (READ MODIFY-WRITE) 작업 및 단일 단계에서 실행하지 않는 작업은 하드웨어 지원이 필요합니다. 원자 적; 그 중에서도 증가 및 감소, fetch_and_add 등.

일부 아키텍처 (i386, AMD_64 및 IA64 포함)의 경우 GCC에는 원자 메모리 액세스를 기본적으로 지원하므로 외부 라이브러리가 필요하지 않습니다. 여기 API에 대한 정보를 읽을 수 있습니다.

엄밀히 말하면, Linux는 원자가 "인터 로크"기능을 Win32의 기능과 같은 기능을 제공 할 수 없습니다. 단순히 이러한 기능은 하드웨어 지원이 필요하고 Linux는 해당 지원을 제공하지 않는 일부 플랫폼에서 실행됩니다. 인텔 x86/x64로 제한 할 수 있다면 부스트 공유 포인터 라이브러리에서 참조 계산의 구현을 살펴보십시오.

그만큼 원자 Apache 휴대용 런타임의 기능은 실제로 Win32 InterlockedXXX 기능에 가깝습니다.

소스에 일부 어셈블리 코드를 삽입하여 X68 연동 지침을 직접 사용할 수 있습니다.

당신은 a를 사용해야합니다 xadd를 잠그십시오 작업.

예를 들어 참조하십시오 이것.

독립형 GTK 및 QT 프로그래밍에 사용되는 상당히 일반적인 GLIB 라이브러리는 다양한 원자 운영을 제공합니다. 보다 http://library.gnome.org/devel/glib/2.16/glib-atomic-operations.html 목록. 거기 있습니다 g_atomic Win32에서 지원하는 대부분의 작업 및 하드웨어가 직접 지원하는 플랫폼에서 기능이 필요한 조립 코드로 인쇄됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top