实现互斥?

时间:2012-04-25 19:10:49

标签: linux mutex

我正在尝试在我的标准库中实现互斥锁,但我没有随身携带它们。我知道尝试实现一些你不一定理解的东西是一个坏主意,但我必须这样做,因为编译现有的线程库(例如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;
    }
}

P.S。如果您对futexes感到疑惑,我正在使用Linux内核。

1 个答案:

答案 0 :(得分:0)

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

查看__sync_lock_test_and_set 你必须有硬件支持来做原子。 GCC内置是一个良好的开端。