휴대용 비교 및 스왑(원자 작동) C/C++ 라이브러리?
여러 컴파일러 간에 이동이 가능한 매크로 또는 함수로 다양한 프로세서의 CAS와 같은 작업을 랩핑하는 작은 라이브러리가 있습니까?
PS. atomic.hpp 라이브러리가 boost::interprocess::detail 네임스페이스 내부에 있습니다.저자는 공공의, 잘 관리되는 도서관으로 만드는 것을 거부합니다.
질문을 다시 열고 다른 옵션이 있는지 알아보겠습니다.
OPA(Open Portable Atomics)는 당신의 요구에 적합할 것입니다.https://trac.mcs.anl.gov/projects/openpa/
MIT 스타일 라이센스로 여러 플랫폼에 걸쳐 공통 원자 작업에 일관된 C API를 제공합니다.그 도서관은 작고 당신의 크기에 맞는 것이 확실합니다.현재 플랫폼 목록은 다음과 같습니다.
- x86, x86_64, ia64, PPC 440 및 MIPS 5K 프로세서용 GCC 인라인 어셈블리.GCC 호환 프론트엔드를 갖춘 여러 컴파일러도 icc, PGI 및 IBM xlc와 같은 아키텍처에서 지원됩니다.
- GCC 원자 고유의 특성으로 인해 대부분의 GCC-4.1+ 설치가 지원됩니다.
- SUN Solaris 원자 작동 라이브러리.
- Windows NT 고유의 기능(현재 Windows에 구축하려면 약간의 추가 작업을 수행해야 함).
- 두 개의 유사 플랫폼, pthread mutex 기반 에뮬레이션은 지원되지 않는 플랫폼으로의 이식성을 위해 (일부 성능을 희생시키면서), 조건부로 단일 스레드 코드로 컴파일되는 코드에 사용하기 위한 "안전하지 않은" 구현입니다.
C++ 프로그램에서 사용해 본 적은 없지만 거의 변화 없이 작동할 수 있습니다.문제가 생기면 기꺼이 수정하겠습니다(메일 opa-discuss@lists.mcs.anl.gov 만 보내주세요).
Boost Interprocess 라이브러리는 다양한 플랫폼과 컴파일러를 위한 Atomic.hpp include file contains compare-and-swap 구현을 원하는 것일 수 있습니다.
Intel Threading Building Blocks는 멋진 휴대용을 가지고 있습니다.atomic<T>
원하는 작업을 수행하는 템플릿입니다.하지만 작은 도서관인지 아닌지는 당연히 논쟁이 될 수 있습니다.
글립의 아토믹 오퍼레이션스 기능에 관심이 있을 겁니다
g_atomic_int_compare_and_exchange()
다양한 아키텍처에 대한 CAS 시맨틱스를 구현합니다.구현 자체는 비교적 이해하기 쉬우며 별도의 노력 없이 독립형으로 사용할 수 있습니다. glib/ trunk/ glib/gatomic의 svn.gnome.org/viewvc/ 에서 확인할 수 있습니다.도움이 되기를 바랍니다!
Mac OS X와 Windows에는 사용해야 할 CompareAndSwap 기능이 내장되어 있습니다(Interlocked Compare).Exchange() 및 OSAtomic Compare AndSwapPtrBarrier()를 각각 비교합니다.따라서 해당 플랫폼의 컴파일러에 관계없이 작동합니다.
다른 유닉스에서는 GCC 4.1 이상을 사용하는 경우 내장된 __sync_val_compare_and_swap()을 사용할 수 있으며, 리눅스에서 생성된 많은 코드가 존재한다고 가정하기 때문에 모든 유닉스 컴파일러가 합리적인 gcc 확장을 지원하는 것은 아니지만 많은 수의 유닉스 컴파일러가 합리적인 gcc 확장을 지원합니다.
따라서 OS X 및 Windows의 모든 프로세서를 위한 대부분의 모든 컴파일러와 다른 플랫폼의 GCC 및 일부 다른 컴파일러와 함께 작동하는 방식으로 마무리하려면 다음과 같은 작업을 수행해야 합니다.
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
return OSAtomicCompareAndSwapPtr (old_value, new_value, ptr);
#elif defined(_MSC_VER)
return InterlockedCompareExchange(ptr, new_value, old_value);
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_val_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
그것은 테스트되지 않았지만, 정확해야 한다고 생각합니다.모든 OS 라이브러리가 다른 순서로 arg를 사용하는 방법을 기록합니다 ;-)
물론 다른 크기에 대해 몇 가지 버전을 비교하고 원한다면 교환하여 템플릿으로 포장할 수 있습니다.API는 대부분 C를 기반으로 하며 템플릿을 통해 유형을 매개 변수화하는 데 익숙한 사람들에게는 다소 불쾌할 정도로 유형 정보를 함수로 인코딩합니다.
Boehm의 atomic_ops 프로젝트의 라이브러리가 있습니다.하지만 면허증에 대해서는 모릅니다.
제안된 C++0x 호환 Boost atomics 라이브러리: http://www.chaoticmind.net/ ~hcb/ projects/boost. atomic/
이 라이브러리의 목적은 C++0x 초안 표준에 의해 지정된 인터페이스에 기초하여 부스트를 위한 원자 연산의 구현을 제공하는 것입니다.std::atomic으로 쉽게 전환할 수 있도록 하는 것을 목표로 하고 있으며, 이 C++0x 기능을 사용하여 이전 시스템에서 컴파일 가능한 코드를 만들 수 있는 수단을 제공합니다.
아직 Boost의 일부는 아니지만 여기서 리뷰 스레드를 확인할 수 있습니다. http://lists.boost.org/Archives/boost/2009/12/160195.php
이제 원자는 방출이라 부를 수 있는 형태가 되었습니다.다음과 같은 "진정한" 원자 변수를 지원합니다.
- gcc/x86, 32비트(Linux, FreeB에서 테스트됨)SD)
- gcc/x86, 64비트(Linux에서 테스트됨)
- gcc/powerpc32(Linux, Mac OS X에서 테스트됨)
- gcc/powerpc64 (미테스트)
- 일반 Win32 (Win XP에서 Visual Studio Express와 함께 테스트됨)
다른 모든 경우에도 잠금 작동 상태로 우아하게 돌아갑니다.희망사항을 설명하는 예제 섹션을 포함한 적절한 퀵북 문서가 있습니다.
(제공하신 링크에서) 작성자님께서 말씀하신 것은 "부스트 공식 라이브러리가 나올 때까지 안전하게 사용하실 수 있을 것 같습니다."인터페이스 변경을 "C++0x에 원자 함수가 존재할 때"까지 연기합니다.
오늘날 어떤 용도로 사용하던 간에 새로운 제품으로 마이그레이션하려는 경우가 많습니다.std::
사용 가능한 경우의 기능입니다.
Boost는 일반적으로 꽤 좋으며, 출시된 Boost 라이브러리의 구현에 사용되는 것으로 보입니다.저도 그 구현을 사용하고 싶다는 유혹을 몇 번 받았습니다.
저라면 해보겠습니다.
http://www.ioremap.net/node/224 에서 영감을 얻기 위해 libsync를 살펴볼 수도 있습니다. 이는 상당히 새로운 것이지만(너무 새로운 것일 수도 있지만), 타원형 네트워크에서 사용되고 있기 때문에 (일부?) 테스트가 가능합니다.
또한 스레드 간 잠금 없는 동기화를 위해 CAS: RCU(Read Copy Update) 옆에 있는 상위 레벨의 프리미티브도 제공합니다.
그러나 이것은 '휴대용'을 의미하는 바에 따라 다릅니다. 아키텍처 x86 및 PPC, OSes Linux, FreeBSD, OpenBSD, Solaris 및 MacOSX를 지원하지만...윈도우 없음.
그리고 라이선스는 GPL로 여러분이 싫어하거나 사랑할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1158374/portable-compare-and-swap-atomic-operations-c-c-library
'source' 카테고리의 다른 글
"중복 키 업데이트 시 [...] 삽입" 문에 대한 권한이 없지만 "삽입" 및 "업데이트"를 개별적으로 수행하기에 충분합니다. (0) | 2023.10.29 |
---|---|
워드프레스의 빈 광고를 보여주는 Google AdSense (0) | 2023.10.29 |
모든 요청에 대해 세션 시간 초과가 재설정됩니까? (0) | 2023.10.24 |
내 진행률 표시줄의 Excel vba 사용자 양식에서 닫기 [X] 버튼 숨기기 (0) | 2023.10.24 |
java.sql 푸는 방법SQL 비일시적 연결예외:결과 집합을 읽을 수 없습니다.연결 재설정? (0) | 2023.10.24 |