线程互斥:使用mutex_trylock实现mutex_lock

时间:2014-08-10 10:15:27

标签: c gcc locking pthreads mutex

在涉及Linux中的线程和进程的OS项目中,我尝试使用类似于pthread_mutex_lock定义的函数Mutex_TryLock在<pthread.h>中创建类似于pthread_mutex_trylock的C函数Mutex_Lock在<pthread.h>。我得到了这段代码:

#define _GNU_SOURCE
#include <pthread.h>
typedef volatile unsigned int Mutex;

int Mutex_TryLock(Mutex *lock)
{
    char oldval;
    __asm__ __volatile__("xchgb %b0,%1"
    :"=q" (oldval), "=m" (*lock)
    :"0" (0) : "memory");
    return oldval > 0;
}

void Mutex_Lock(Mutex* lock)
{
    while(! Mutex_TryLock(lock)) pthread_yield();
}
据称,Mutex_TryLock是从Linux代码中获取的。但如果它像pthread_mutex_trylock解释here那样工作,它应该在成功时返回零,在失败时返回非零。因此,在Mutex_Lock成功的同时循环条件将为true并且调用线程将被置于保持状态。失败时,while循环条件为false,调用线程将立即退出Mutex_Lock。这与pthread_mutex_lock应该做的相反吗?或者,Mutex_TryLock不像pthread_mutex_trylock那样工作?

1 个答案:

答案 0 :(得分:1)

你的Mutex_TryLock()设置(部分)锁定为零,如果之前大于零,则返回true。因此小于或等于零&lt; =&gt;已锁定,且大于零&lt; =&gt;解锁。如果&#34;解锁&#34;那么这将是显而易见的。和&#34; init&#34;显示了各种功能。

我不确定将互斥锁声明为unsigned int,然后只使用char的{​​{1}} char位于{{unsigned int的最低地址1}}),完全是美丽的,尤其是你的char可能会签名!

无论如何,trueMutex_TryLock()&lt; =&gt;返回了Mutex_Lock()锁是解锁&lt; =&gt;锁获得成功。因此,如果未成功获取锁定,则pthread_mutex_trylock()会产生,这似乎是正确的。

您是正确的,0如果成功获取锁,则返回EBUSY,否则返回错误。可能的错误中有{{1}},这意味着无法获取锁,因为某些线程已被锁定。