> 백엔드 개발 > C++ > 본문

뮤텍스 없이 C 11에서 다중 스레드 싱글톤을 구현하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-03 13:42:30
원래의
675명이 탐색했습니다.

How to Implement a Multithreaded Singleton in C  11 Without Mutexes?

뮤텍스 없이 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿