뮤텍스 없이 C 11에서 멀티스레드 싱글톤 구현
C 11에 멀티스레딩 기능이 도입되면서 싱글톤을 어떻게 구현하는지에 대한 의문이 생깁니다. 성능 최적화를 위해 뮤텍스를 활용하지 않고. 제안된 접근 방식은 원자 변수와 std::atomic_compare_exchange_strong() 함수의 사용을 포함합니다:
<code class="cpp">class Singleton { public: static bool isInitialized() { return (flag == 2); } static bool initizalize(const string& name_) { if (flag == 2) return false; if (flag == 1) return false; int exp = 0; int desr = 1; bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr); if (!willInitialize) { cout << "Somebody else CASed at aprox same time" << endl; return false; } else { initialize_impl(name_); assert(flag == 1); flag = 2; return true; } } static void clear() { name.clear(); flag = 0; } private: static void initialize_impl(const string& name_) { name = name_; } static atomic<int> flag; static string name; };</code>
원자 변수와 std::atomic_compare_exchange_strong() 함수는 스레드 동기화 오버헤드를 도입하지 않고 스레드 안전을 보장합니다. 그러나 이 접근 방식에서는 데이터 경합을 방지하고 적절한 초기화를 보장하기 위해 여전히 신중한 처리가 필요합니다.
C 11 표준은 초기화 안전을 강화합니다
흥미롭게도 C 11의 표준에서는 특정 시나리오에서는 수동 잠금. 다음 코드 조각은 이 동작을 활용합니다.
<code class="cpp">static Singleton& get() { static Singleton instance; return instance; }</code>
정적 변수 인스턴스를 초기화하려고 시도하는 동시 실행은 암시적으로 완료를 기다리므로 잠재적인 경쟁 조건이 줄어듭니다.
Singleton Anti- 패턴
위 접근 방식은 멀티스레드 싱글톤 구현을 위한 솔루션을 제공하지만 일반적으로 싱글톤 사용이 권장되지 않는다는 점은 주목할 가치가 있습니다. 결합, 상태 종속성을 도입하고 단위 테스트를 복잡하게 만들 수 있습니다. 공유 리소스 및 종속성을 관리하려면 대체 디자인 패턴이 선호되는 경우가 많습니다.
위 내용은 뮤텍스 없이 C 11에서 다중 스레드 싱글톤을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!