我正在尝试在我的标准库中实现互斥锁,但我没有随身携带它们。我知道尝试实现一些你不一定理解的东西是一个坏主意,但我必须这样做,因为编译现有的线程库(例如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内核。
答案 0 :(得分:0)
http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
查看__sync_lock_test_and_set 你必须有硬件支持来做原子。 GCC内置是一个良好的开端。