[英]How frequently does mutex::lock() check for the unlocked state if it's already locked by another thread?
据cppreference ,构建std::lock_guard
用std::mutex
参数调用lock()
该方法mutex
。
根据cplusplus ,关于mutex
的lock()
方法:
如果互斥锁被另一个线程锁定,则调用线程的执行将被阻止,直到被另一个线程解锁为止。
我不确定标题问题的措词是否正确,因此将其放在以下代码的上下文中。
我想测试一下,看看调用线程是否实际上在等待解锁,而不是终止其可调用对象(例如函数,函子,lambda)的执行和/或引发异常。 以下代码具有两个线程t1
和t2
,每个线程都由指向同一函数foo
的指针构成。 在执行锁定保护的代码之前,每次对foo
调用都会sleep_for
一定的时间(由foo
的unsigned
参数num
确定)。 锁定保护的代码本身包含另一个sleep_for
周期,以使任何被阻止的执行周期更加明显:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex m;
void foo(unsigned num) {
std::this_thread::sleep_for(std::chrono::milliseconds(num * 10));
std::lock_guard<std::mutex> guard(m);
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << num << std::endl;
}
int main() {
std::thread t1(foo, 10);
std::thread t2(foo, 5);
t1.join();
t2.join();
}
控制台输出:
5
10
5
的输出大约/至少需要3.05秒。 10
输出大约需要/至少需要3秒。 这意味着t2
首先要执行受保护的代码,因为在mutex
锁定之前, t2
的等待时间较短。
我假设一旦线程t1
对foo
的调用到达了lock_guard
行并发现mutex
已经被t2
锁定,则t1
不会终止执行或引发异常。 t1
只是等待它被解锁。
std::mutex::lock()
或std::lock_guard
多久检查一次解锁? 支票多少钱? 是否按照以下方式实施检查?
while (some_mutex.try_lock() == false) {
std::this_thread::sleep_for(std::chrono::milliseconds(1))
}
// execute lock-protected code
std :: mutex :: lock()或std :: lock_guard多久检查一次解锁?
没有。 它在操作系统内部阻塞,直到释放资源为止。 任何通过旋转实现此功能的操作系统都将引起投诉。
互斥锁通常由操作系统提供,这意味着操作系统的线程模型对此负责。 这些细节完全没有被C ++指定或实现。
因此,在某种程度上,这将取决于许多因素,例如所有进程的CPU负载,相对进程优先级,相对线程优先级...
即使为您提供了明确的答案,也有太多事情要做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.