我正在尝试在我的标准库中实现互斥锁,但我无法使用它们。我知道尝试实现你不一定理解的东西是个坏主意,但我必须这样做,因为在这个平台上编译现有的线程库(如 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 内核。