C 11에서 멀티스레드 싱글톤 구현
C 11의 멀티스레딩 기능이 등장하면서 싱글톤 구현을 위해 뮤텍스를 사용하는 전통적인 접근 방식은 성능상의 이유로 더 이상 필요하지 않습니다.
원자적 연산이 포함된 잠금 없는 싱글톤
뮤텍스 없이 싱글톤을 생성하는 한 가지 방법은 원자적 연산을 이용하는 것입니다. 원자 부울 변수와 std::atomic_compare_exchange_strong() 함수를 사용하면 다음 솔루션을 구현할 수 있습니다.
<code class="cpp">public class Singleton { private static atomic<int> flag = 0; private static string name; public static bool initialized() { return (flag == 2); } public static bool initialize(string name_) { if (flag == 2) { return false; // Already initialized } int exp = 0, desr = 1; bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr); if (!willInitialize) { return false; // Another thread CASed before us } initialize_impl(name_); assert(flag == 1); flag = 2; return true; } private static void initialize_impl(string name) { name = name; } }</code>
C 11 스레드로부터 안전한 초기화
C 11 스레드로부터 안전한 정적 초기화를 도입하여 수동 잠금이 필요하지 않습니다. 정적 지역 변수가 초기화되기를 기다리는 동시 실행을 통해 다음과 같은 단순화된 구현이 가능합니다.
<code class="cpp">static Singleton& get() { static Singleton instance; return instance; }</code>
싱글톤 대안
이러한 솔루션이 멀티스레드의 안전한 싱글톤 구현을 제공하더라도 싱글톤 패턴 자체가 항상 최선의 디자인 선택은 아닙니다. 객체를 함수 인수로 전달하거나, 종속성 주입을 사용하거나, 상태 패턴을 사용하는 등의 대안을 고려해보세요.
위 내용은 원자 연산을 사용하는 잠금 없는 싱글톤이 뮤텍스를 사용하는 것보다 C 11에서 더 나은 접근 방식입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!