C++ 互斥锁如何在低级别等待解锁?
我想知道互斥锁(或其他锁定实现)如何实现锁定函数的等待功能。我的意思是,这是一条cpu指令,对mutex.lock调用进行排队,这是仅在操作系统中实现的还是什么 在我所做的测试中,我认为这种等待功能只在操作系统层完成,并且创建了某种旋转,检查锁是否可以继续,如果没有使线程进入睡眠状态。是这样吗C++ 互斥锁如何在低级别等待解锁?,c++,multithreading,locking,mutex,C++,Multithreading,Locking,Mutex,我想知道互斥锁(或其他锁定实现)如何实现锁定函数的等待功能。我的意思是,这是一条cpu指令,对mutex.lock调用进行排队,这是仅在操作系统中实现的还是什么 在我所做的测试中,我认为这种等待功能只在操作系统层完成,并且创建了某种旋转,检查锁是否可以继续,如果没有使线程进入睡眠状态。是这样吗 非常感谢。这取决于平台。通常,如果达到固定的自旋限制,操作系统中会有一个自旋锁部分返回到阻塞状态 自旋锁通常通过在互斥锁解锁时读取包含特定值的内存地址来实现。如果它被视为已解锁,则会尝试以原子方式将该值从
非常感谢。这取决于平台。通常,如果达到固定的自旋限制,操作系统中会有一个自旋锁部分返回到阻塞状态 自旋锁通常通过在互斥锁解锁时读取包含特定值的内存地址来实现。如果它被视为已解锁,则会尝试以原子方式将该值从解锁值更改为锁定值。如果原子交换成功,互斥锁将被锁定。通常会计算旋转的数量,如果达到限制,我们会切换到操作系统中的阻塞 操作系统中的块的实现方式基本相同,只是线程将自己添加到等待锁定的事物列表中,而不是休眠。当一个线程释放锁时,它会检查操作系统中是否有任何东西在等待,如果有,就会解除锁定。这会导致操作系统调度该线程。然后,它通常会尝试执行与自旋锁相同的原子交换,如果失败,会在操作系统中再次阻塞 在伪代码中: 锁定:
视情况而定。典型的实现是在操作系统中完成的。它在旋转循环中等待一段时间,但随后线程从可运行队列中移除,并放入与互斥体关联的列表中。释放互斥体时,将从与互斥体关联的列表中删除一个线程,并在“等待”的有趣部分中标记为“可再次运行”,而“阻塞”指的是与操作系统调度程序的交互。这基本上是一个直到稍后某个时间点才被安排的请求。