【问题标题】:Thread mutual exclusion: mutex_lock implemented with mutex_trylock线程互斥:mutex_lock 用 mutex_trylock 实现
【发布时间】: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


【解决方案1】:

您的Mutex_TryLock() 将锁定(部分)设置为零,如果之前大于零,则返回true。所以小于或等于零 锁定,大于零 解锁。如果显示“解锁”和“初始化”函数,这一点就很明显了。

我不确定将互斥体声明为unsigned int,然后只使用它的第一个charcharunsigned int 中的最低地址)是否完全漂亮,尤其是因为您的char 可能已签名!

无论如何,trueMutex_TryLock() 返回 锁解锁 锁成功获取。因此,如果未成功获取锁,您的 Mutex_Lock() 会产生,这似乎是正确的。

你是对的,pthread_mutex_trylock()如果获取锁成功返回0,否则返回错误。可能的错误包括EBUSY,这意味着无法获取锁,因为某个线程已经将其锁定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2013-01-31
    • 1970-01-01
    • 2012-12-21
    • 2012-07-06
    • 2014-05-02
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多