【发布时间】:2014-10-03 08:33:18
【问题描述】:
在涉及 Linux 中的线程和进程的 OS 项目中,我尝试使用类似于 <pthread.h> 中定义的 pthread_mutex_trylock 的名为 Mutex_TryLock 的函数在 C 中创建一个函数 Mutex_Lock,类似于在 <pthread.h> 中定义的 pthread_mutex_lock。我得到了这个代码:
#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 成功时,while 循环条件将为真,调用线程将被搁置。失败时,while 循环条件为假,调用线程将立即退出 Mutex_Lock。这不与pthread_mutex_lock 应该做的相反吗?或者,Mutex_TryLock 不像pthread_mutex_trylock那样工作?
【问题讨论】:
-
既然你已经在使用
pthread_yield(因此是pthreads),为什么不使用pthread_mutex_lock? -
这是项目的限制。我的意思是我必须为一些基本的 Linux 线程操作编写代码,但我可以使用给定的代码。在这种情况下,pthread_yield 被认为是给定的。
标签: c gcc locking pthreads mutex