在涉及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
那样工作?
答案 0 :(得分:1)
你的Mutex_TryLock()
设置(部分)锁定为零,如果之前大于零,则返回true
。因此小于或等于零&lt; =&gt;已锁定,且大于零&lt; =&gt;解锁。如果&#34;解锁&#34;那么这将是显而易见的。和&#34; init&#34;显示了各种功能。
我不确定将互斥锁声明为unsigned int
,然后只使用char
的{{1}} char
位于{{unsigned int
的最低地址1}}),完全是美丽的,尤其是你的char
可能会签名!
无论如何,true
从Mutex_TryLock()
&lt; =&gt;返回了Mutex_Lock()
锁是解锁&lt; =&gt;锁获得成功。因此,如果未成功获取锁定,则pthread_mutex_trylock()
会产生,这似乎是正确的。
您是正确的,0
如果成功获取锁,则返回EBUSY
,否则返回错误。可能的错误中有{{1}},这意味着无法获取锁,因为某些线程已被锁定。