4

尝试在 C 中实现一个非常简单的互斥体(锁)时我有点困惑。我知道互斥体类似于二进制信号量,除了互斥体还强制释放锁的线程必须是最近获得它的同一线程。我对如何跟踪所有权感到困惑?

这就是我到目前为止所拥有的。请记住,它还没有完成,并且应该非常简单(单处理器,互斥体上没有递归,禁用中断作为互斥方法等)。

struct mutex {
    char *mutexName;
    volatile int inUse;
};

我相信我应该添加另一个成员变量,即 whoIsOwner,但我对在那里存储的内容有点困惑。我认为它必须是可以唯一标识尝试调用锁的线程的东西?它是否正确?

我有一个线程结构,它有一个“char *threadName”成员变量(以及其他变量),但我不确定如何从互斥锁实现中访问它。

任何指针/提示/想法将不胜感激。

4

2 回答 2

4

您可以将互斥锁实现为一个原子整数,0当它被解锁时,它采用锁定线程 ID 的值来指示它已被锁定。当然,对变量的访问必须是原子的,并且需要适当地围起来以防止重新排序(获取-释放围栅对就足够了)。

归根结底,你当然永远不能阻止自己在脚上开枪。如果你真的想要,你可以从另一个线程强制覆盖互斥锁的内存,或者类似的东西。只有正确使用工具,才能获得正确的行为。考虑到这一点,您可能会对锁定变量的简单布尔值感到满意。

于 2012-05-22T21:46:26.973 回答
2
uint32_t  semOwner;

如果上面的字段为 0,那么它是可用的。如果它是“拥有的”,那么让它设置为拥有任务的 ID,或线程,或进程 ID/线程 ID 组合(或其他可能适合您系统的组合)。

希望这可以帮助。

于 2012-05-22T21:47:17.333 回答