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如果你想知道 futexes,我使用的是 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 回答