문제

C에서 싱글 톤을 만드는 가장 좋은 방법은 무엇입니까? 동시 솔루션이 좋을 것입니다.

나는 C가 당신이 싱글 톤에 사용할 첫 번째 언어가 아니라는 것을 알고 있습니다.

도움이 되었습니까?

해결책

첫째, C는 OO 프로그래밍에 적합하지 않습니다. 당신이 그렇게한다면 당신은 끝까지 싸울 것입니다. 둘째, 싱글 톤은 일부 캡슐화가있는 정적 변수 일뿐입니다. 따라서 정적 글로벌 변수를 사용할 수 있습니다. 그러나 글로벌 변수는 일반적으로 그들과 관련된 병이 너무 많습니다. 그렇지 않으면 다음과 같은 함수 로컬 정적 변수를 사용할 수 있습니다.

 int *SingletonInt() {
     static int instance = 42;
     return &instance;
 }

또는 더 똑똑한 매크로 :

#define SINGLETON(t, inst, init) t* Singleton_##t() { \
                 static t inst = init;               \
                 return &inst;                       \
                }

#include <stdio.h>  

/* actual definition */
SINGLETON(float, finst, 4.2);

int main() {
    printf("%f\n", *(Singleton_float()));
    return 0;
}

마지막으로, 싱글 톤은 대부분 학대를 당했다는 것을 기억하십시오. 특히 멀티 스레드 환경에서 제대로하기가 어렵습니다 ...

다른 팁

당신은 할 필요가 없습니다. C는 이미 글로벌 변수를 가지고 있으므로 시뮬레이션을 위해 해결 방법이 필요하지 않습니다.

C ++ 버전과 거의 동일합니다. 인스턴스 포인터를 반환하는 함수 만 있습니다. 함수 내에서 정적 변수 일 수 있습니다. 플랫폼에 따라 기능 본문을 임계 섹션 또는 pthread mutx로 감싸십시오.

#include <stdlib.h>

struct A
{
    int a;
    int b;
};

struct A* getObject()
{
    static struct A *instance = NULL;

    // do lock here
    if(instance == NULL)
    {
        instance = malloc(sizeof(*instance));
        instance->a = 1;
        instance->b = 2;
    }
    // do unlock

    return instance;
};

싱글 톤을 확보하려면 기능이 필요합니다. 특히 프로세스 출구에서 자동으로 릴리스되지 않은 시스템 리소스를 잡는 경우.

편집 : 내 대답은 당신이 만든 싱글 톤이 다소 복잡하고 다단계 제작 과정이 있다고 가정합니다. 정적 데이터 일 뿐이라면 다른 사람들이 제안한 것처럼 글로벌과 함께 가십시오.

C의 싱글 톤은 매우 이상합니다. . . 나는 특히 우아하게 보이는 "객체 지향 C"의 예를 본 적이 없다. 가능하면 C ++ 사용을 고려하십시오. C ++를 사용하면 사용하려는 기능을 선택하고 선택할 수 있으며 많은 사람들이 "더 나은 C"로 사용할 수 있습니다.

아래는 잠금없는 일회성 초기화를위한 매우 일반적인 패턴입니다. interlockcompareexchangeptr은 이전이 null이면 새 값으로 원자 적으로 스왑됩니다. 이렇게하면 여러 스레드가 싱글 톤을 동시에 만들려고하면 하나만 이길 수 있습니다. 다른 사람들은 새로 생성 된 객체를 삭제합니다.

MyObj* g_singleton; // MyObj is some struct.

MyObj* GetMyObj()
{
    MyObj* singleton;
    if (g_singleton == NULL)
    {
        singleton = CreateNewObj();

        // Only swap if the existing value is null.  If not on Windows,
        // use whatever compare and swap your platform provides.
        if (InterlockCompareExchangePtr(&g_singleton, singleton, NULL) != NULL)
        {
              DeleteObj(singleton);
        }
    }

    return g_singleton;
}

DoSomethingWithSingleton(GetMyObj());

또 다른 관점은 다음과 같습니다. C 프로그램의 모든 파일은 효과적으로 런타임에 자동 인스턴스화되어 서브 클래스를 사용할 수없는 싱글 톤 클래스입니다.

  • 글로벌 정적 변수는 개인 클래스 회원입니다.
  • 글로벌 비 정적은 공개적입니다 ( extern 일부 헤더 파일에서).
  • 정적 함수는 개인 방법입니다
  • 비 정적 기능은 공개 기능입니다.

모든 것을 적절한 접두사에게 제공하면 이제 사용할 수 있습니다. my_singleton_method() 대신 my_singleton.method().

싱글 톤이 복잡하다면 쓸 수 있습니다 generate_singleton() 방법을 사용하기 전에 초기화하는 방법이지만 다른 모든 공개 메소드가 호출되었는지 확인하고 오류가 발생하지 않은지 확인해야합니다.

그냥 해

void * getSingleTon() {
    static Class object = (Class *)malloc( sizeof( Class ) );
    return &object;
}

동시 환경에서도 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top