0

このコードで問題を引き起こす可能性のあるものを誰かが見ているかどうか疑問に思っています。これを行うために使用できる他の方法/API呼び出しがあることは知っていますが、プラットフォームに依存しない独自の基盤を築こうとしていますか? / クロスプラットフォームのミューテックス フレームワーク。

明らかに、いくつかの #ifdef を実行し、Win32 Sleep() および GetCurrentThreadID() 呼び出し用にいくつかのマクロを定義する必要があります...

typedef struct aec {
    unsigned long long lastaudibleframe; /* time stamp of last audible frame */
    unsigned short aiws; /* Average mike input when speaker is playing */
    unsigned short aiwos; /*Average mike input when speaker ISNT playing */
    unsigned long long t_aiws, t_aiwos; /* Internal running total */
    unsigned int c_aiws, c_aiwos; /* Internal counters */
    unsigned long lockthreadid;
    int stlc; /* Same thread lock count */
} AEC;

char lockecho( AEC *ec ) {
    unsigned long tid=0;
    static int inproc=0;
    while (inproc) {
        Sleep(1);
    }
    inproc=1;
    if (!ec) {
        inproc=0;
        return 0;
    }
    tid=GetCurrentThreadId();
    if (ec->lockthreadid==tid) {
        inproc=0;
        ec->stlc++;
        return 1;
    }
    while (ec->lockthreadid!=0) {
        Sleep(1);
    }
    ec->lockthreadid=tid;
    inproc=0;
    return 1;
}

char unlockecho( AEC *ec ) {
    unsigned long tid=0;
    if (!ec)
        return 1;
    tid=GetCurrentThreadId();
    if (tid!=ec->lockthreadid)
        return 0;
    if (tid==ec->lockthreadid) {
        if (ec->stlc>0) {
            ec->stlc--;
        } else {
            ec->lockthreadid=0;
        }
    }
    return 1;
}
4

2 に答える 2

3

いいえ、そうではありません。低レベルのアトミック操作(RMWTest 、および Set ... など)を使用せずに、プレーンな C コードでミューテックスを実装することはできません。特定の例では、コンテキスト スイッチが最初のスレッドが を設定する機会を得る前にinproc、次に 2 番目のスレッドが再開して に設定し1、両方のスレッドが構造体への排他的アクセス権を持っていると「考える」ようになります。 .

また、スレッドが を設定する機会を得たとしてもinproc、割り当てがアトミックであるとは限りません (変数の割り当ての途中で中断される可能性があります)。

于 2013-08-05T06:37:20.713 に答える