4

こんにちは。ライブラリに完全にスレッドセーフな初期化関数を作成しようとしていますが、問題を非常に簡単に解決できる pthread_once に代わるものを簡単に見つけることができませんでした。私はこのコードに来ました:


void libInit (void)
{
#ifdef WIN32
    static volatile int initialized = 0;
    static HANDLE mtx;

    if (!initialized)
    {
        if (!mtx)
        {
            HANDLE mymtx;
            mymtx = CreateMutex(NULL, 0, NULL);
            if (InterlockedCompareExchangePointer(&mtx, mymtx, NULL) != NULL)
                CloseHandle(mymtx);
        }

        WaitForSingleObject(mtx);
        if (!initialized)
        {
            libInitInternal();
            initialized = 1;
        }
        ReleaseMutex(mtx);
    }
#else
    static pthread_once_t initialized = PTHREAD_ONCE_INIT;

    pthread_once(&initialized, libInitInternal);
#endif
}

このlibInitInternal()呼び出しは、ライブラリを初期化するスレッドセーフでない関数につながります。

私が間違っている可能性があること、またはより良い解決策を知っているかどうかについての提案を聞きたいです。

4

5 に答える 5

7

ワンタイム初期化機能を使いたいと思います。同期モードでは、それを呼び出す最初のスレッドが完了するまで、すべてのスレッドがブロックされます。pthread_once()に類似しているようです。

ここにサンプルコードがあります。

したがって、あなたの場合、あなたはこう言うでしょう:

BOOL CALLBACK CallLibInitInternal(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex) {
    libInitInternal();
    return TRUE;
}

void libInit() {
#ifdef WIN32
    static INIT_ONCE s_init_once;
    InitOnceExecuteOnce(&s_init_once, CallLibInitInternal, NULL, NULL);
#else
...
#endif
}
于 2009-03-11T02:31:03.530 に答える
3

pthread_once()実装でpthreads-win32が何をするかを確認することをお勧めします。または、それが簡単であることが判明した場合は、それを使用してください。

于 2009-03-22T16:58:50.823 に答える
2

GCCまたはclangを使用する場合は、コンストラクター属性とデストラクター属性を使用できます。これらは共有ライブラリと静的ライブラリの両方で機能し、mainの実行前と実行後にそれぞれコードを実行します。さらに、複数のコンストラクタおよびデストラクタ関数を指定できます。シングルトンアプローチよりもはるかにクリーンであり、main()からlibInit()を呼び出すことを覚えておく必要はありません。

static void __attribute__((constructor))
your_lib_init(void)
{
    fprintf(stderr, "library init\n");
}

static void __attribute__((destructor))
vensim_ctx_destroy(void)
{
    fprintf(stderr, "library destroy\n");
}
于 2011-04-12T17:55:58.913 に答える
0

この記事をチェックします。これは C++ シングルトンのソリューションですが、コードにもこのソリューションを使用できると思います: http://www.ddj.com/cpp/199203083?pgno=1

悲しいことに、QLock 自体のリストがありません。CD を販売しようとしているかのように見えますが、自分で書くには十分な説明があるようです。

于 2009-03-10T22:19:24.680 に答える