0

標準ライブラリ内にミューテックスを実装しようとしていますが、うまくいきません。必ずしも理解していないものを実装しようとするのは悪い考えであることはわかっていますが、このプラットフォームでは既存のスレッド ライブラリ (uClibc など) をコンパイルすることは不可能であるため、実装する必要があります。ミューテックスについて「私が5人のように説明してください」というものはありますか? または、「従うのが簡単な」実装はありますか?私がこれまで見てきたすべての pthread 実装は、理解することが不可能です。

私のロック機能の実装を以下に示します。自分が何をしているのかわからないので、何か深刻な問題があると確信しています。

int pthread_mutex_lock(pthread_mutex_t *pmutex)
{
    OSMutex* mutex = GetOSMutex(pmutex);

    /* Decrement the mutex counter */
    OSAtomicDecrement32(&(mutex->count));
    if (mutex->count < -1) {
        /*
            Contended, wait for the mutex to be released.
         */
        lnkLog("mutex %p already held (n=%d), waiting for stuff to change", mutex, mutex->count);

        futex$LINUX(&(mutex->data),
                    FUTEX_WAIT,
                    MUTEX_MAGIC,
                    NULL,
                    NULL,
                    0);

        lnkLog("mutex %p was released", mutex);

        return 0;
    }
    else {
        /*
            Not contended. Acquire the mutex.
         */
        lnkLog("locking %p", mutex);

        mutex->data = MUTEX_MAGIC;
        return 0;
    }
}

PS futex について疑問がある場合は、Linux カーネルを使用しています。

4

1 に答える 1

0

http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html

__sync_lock_test_and_setを調べてください。アトミックを実行するには、ハードウェアサポートが必要です。GCCビルトインは良いスタートです。

于 2012-04-25T19:17:47.100 に答える