> 백엔드 개발 > C++ > 뮤텍스 없이 C 11에서 잠금 없는 싱글톤을 구현하는 방법은 무엇입니까?

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

Patricia Arquette
풀어 주다: 2024-10-29 12:12:29
원래의
458명이 탐색했습니다.

How to Implement a Lock-Free Singleton in C  11 Without Mutexes?

뮤텍스 없이 C 11에서 멀티스레드에 안전한 싱글톤 구현

C 11에서 멀티스레딩은 싱글톤 클래스 구현에 대한 새로운 문제를 야기합니다. 뮤텍스를 사용하면 스레드 안전성이 보장되지만 성능에 영향을 미칠 수 있습니다. 이 기사에서는 뮤텍스에 의존하지 않고 잠금 없는 싱글톤을 생성하는 대체 접근 방식을 살펴봅니다.

문제 설명:

C 11에서 지연 초기화 싱글톤을 어떻게 구현할 수 있습니까? 성능상의 이유로 뮤텍스를 사용하지 않습니까?

제안된 솔루션:

atomic_compare_exchange_strong:

잠금 없는 초기화를 달성하려면 std::atomic_compare_exchange_strong 함수를 활용할 수 있습니다. 이 원자성 작업은 std::atomic 변수(플래그)의 예상 값을 원하는 값(desr)과 비교하고 일치하는 경우 변수를 desr로 업데이트합니다.

초기화 프로세스:

초기화 기능 내에서 다음 단계를 수행합니다.

  1. 플래그를 1로 설정하여 초기화가 진행 중임을 나타냅니다.
  2. atomic_compare_exchange_strong을 사용하여 다음과 같은지 확인합니다. 플래그는 1입니다. 그렇다면 초기화를 진행합니다.
  3. CAS가 성공하면 플래그가 2로 설정되어 초기화 성공을 나타냅니다.
  4. CAS가 실패하면 다른 스레드가 이미 초기화된 것입니다. 싱글톤.

스레드 안전성:

스레드의 동시 실행은 다음 방법으로 처리됩니다.

  • If 플래그 가 이미 2이면 초기화가 이미 완료된 것입니다.
  • 플래그가 0이면omic_compare_exchange_strong을 사용하여 초기화를 시도합니다.
  • 플래그가 1이면 현재 다른 스레드가 초기화 중이므로 현재 스레드가 대기합니다.

구현 예:

<code class="cpp">class Singleton
{
public:
    static Singleton& get()
    {
        static Singleton instance;
        return instance;
    }

    static bool initialize(const string& name);
};</code>
로그인 후 복사

결론:

atomic_compare_exchange_strong 함수를 활용하여, 뮤텍스에 의존하지 않고 C 11에서 다중 스레드로부터 안전한 싱글톤을 구현할 수 있습니다. 이 접근 방식을 사용하면 주어진 시간에 단 하나의 스레드만 싱글톤을 성공적으로 초기화할 수 있습니다.

위 내용은 뮤텍스 없이 C 11에서 잠금 없는 싱글톤을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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