我试图在C中实现一个非常简单的互斥锁(锁)有点困惑。我理解互斥锁类似于二进制信号量,除了互斥锁还强制执行释放锁的线程的约束,必须是最近获得它的同一个线程。我对如何跟踪所有权感到困惑?
这是我到目前为止所拥有的。请记住,它还没有完成,并且假设非常简单(单处理器,互斥体上没有递归,禁止中断作为互斥方法等)。
struct mutex {
char *mutexName;
volatile int inUse;
};
我相信我应该添加另一个成员变量,即whoIsOwner,但我有点困惑,因为它存储在那里。我认为它必须能够唯一地识别试图调用锁的线程?它是否正确?
我有一个具有“char * threadName”成员变量(以及其他变量)的线程结构,但我不确定如何从互斥锁实现中访问它。
任何指针/提示/想法都将不胜感激。
答案 0 :(得分:3)
您可以将互斥锁实现为原子整数,解锁后为0
,并获取锁定线程ID的值以指示其已被锁定。当然,对变量的访问必须是原子的,并且适当地隔离以防止重新排序(获取 - 释放围栏对就足够了)。
最终你绝对不能阻止自己在脚下射击自己;如果你真的想要你可以通过另一个线程或类似的东西强制覆盖互斥锁的内存。只有正确使用工具,才能获得正确的行为。考虑到这一点,您可能会对锁定变量的简单bool感到满意。
答案 1 :(得分:2)
uint32_t semOwner;
如果上述字段为0,则表示该字段可用。如果它是"拥有",则将其设置为拥有任务或线程的ID,或进程ID /线程ID组合(或可能适合您系统的其他组合)。
希望这有帮助。