c-使用测试和集合实现锁



以下是OSTEP书中给出的关于使用测试和设置指令实现锁的代码。我的问题是,在这样的实现中,不持有锁的线程不能调用unlock函数并拿走锁吗?

typedef struct __lock_t {
int flag;
} lock_t;
void init(lock_t *lock) {
// 0 indicates that lock is available, 1 that it is held
lock->flag = 0;
}
void lock(lock_t *lock) {
while (TestAndSet(&lock->flag, 1) == 1)
; // spin-wait (do nothing)
}
void unlock(lock_t *lock) {
lock->flag = 0;
}

假设这是一个编码错误,所以这种情况不应该发生。

我的问题是,在这样的实现中,不持有锁的线程不能调用unlock函数并拿走锁吗?

(例如(一个线程获取锁,通知另一个线程它可以继续(或者可能生成一个新线程(,然后其他线程释放锁,这没有错。

如果一个线程获取了一个锁,然后两次释放它,就会出现非常错误的情况。

为了检测错误(同时仍然支持所有合法的场景(;当锁定未被保持时调用的unlock()";。可以通过在unlock()中使用原子TestAndClear()来实现这一点。

如果你想强制执行";只有获得锁的线程可以释放锁";那么你必须知道哪个线程获取了锁,所以当获取锁时,你必须在锁中存储线程ID(例如,可以使用原子"比较,如果相等则交换"(。

最新更新