根据cppreferencestd::lock_guard
,使用参数构造 an会std::mutex
调用lock()
that 的方法mutex
。
根据cplusplus,关于mutex
'slock()
方法:
如果互斥锁被另一个线程锁定,则调用线程的执行将被阻塞,直到被另一个线程解锁...
我不确定名义上的问题是否措辞正确,因此我将其放在以下代码的上下文中。
我想对此进行测试,看看调用线程是否真的在等待解锁,而不是终止其可调用对象(例如函数、仿函数、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
输出大约/至少需要 3.05 秒5
。输出需要大约/至少额外 3 秒10
。这意味着t2
首先执行受保护的代码,因为它在锁定mutex
.
我假设一旦对foo
from 线程的调用t1
到达该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