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