gpt4 book ai didi

c++ - 互斥锁是如何真正工作的?

转载 作者:IT老高 更新时间:2023-10-28 21:50:46 25 4
gpt4 key购买 nike

互斥锁背后的想法是在任何时候只允许一个线程访问一段内存。如果一个线程锁定了互斥体,任何其他锁定尝试都将阻塞,直到第一个解锁。然而,这是如何实现的呢?要锁定自己,互斥锁必须在某个地方设置一个表示它已锁定的位置。但是,如果第二个互斥锁同时读取第一个互斥锁,该怎么办。更糟糕的是,如果他们同时锁定互斥锁怎么办?互斥体将屈服于它旨在防止的相同问题。

互斥锁是如何工作的?

最佳答案

低级原子操作。这些本质上是在硬件中实现的互斥锁,除了您只能以原子方式执行很少的操作。

考虑以下等效伪代码:

mutex global_mutex;
void InterlockedAdd(int& dest, int value) {
scoped_lock lock(mutex);
dest += value;
}
int InterlockedRead(int& src) {
scoped_lock lock(mutex);
return src;
}
void InterlockedWrite(int& dest, int value) {
scoped_lock lock(mutex);
dest = value;
}

这些功能是由 CPU 以指令的形式实现的,它们在不同程度上保证了线程之间的一致性。确切的语义取决于所讨论的 CPU。 x86 提供顺序一致性。这意味着操作的行为就像它们是按某种顺序按顺序发出的一样。这显然涉及到一些阻塞。

您可以准确地推测原子操作可以用互斥体来实现,反之亦然。但通常,原子操作由硬件提供,然后由操作系统在它们之上实现互斥锁和其他同步原语。这是因为有些算法不需要完整的互斥体并且可以操作所谓的“无锁”,这意味着只使用原子操作来实现一些线程间的一致性。

关于c++ - 互斥锁是如何真正工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11770571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com