根据cppreference,使用std::lock_guard
参数构建std::mutex
会调用lock()
的{{1}}方法。
根据cplusplus,关于mutex
的{{1}}方法:
如果互斥锁被另一个线程锁定,则执行调用 线程被阻塞,直到另一个线程解锁...
我不确定这个名称问题的措辞是否正确,所以我将其置于以下代码的上下文中。
我想测试这个并查看调用线程是否实际等待解锁而不是终止其可调用的执行(例如函数,仿函数,lambda)和/或抛出异常。以下代码有两个线程mutex
和lock()
,每个线程都使用指向同一函数t1
的指针构造。在执行受锁保护的代码之前,对t2
的每次调用都会foo
一段时间,由foo
的{{1}}参数sleep_for
确定。受锁保护的代码本身包含另一个foo
句点,以使任何被阻止的执行期更加明显:
unsigned
控制台输出:
num
输出sleep_for
需要大约/至少3.05秒。 #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();
}
输出大约需要/至少额外3秒。这意味着5
10
首先执行受保护的代码,因为它在锁定5
之前的等待时间较短。
我假设从线程10
调用t2
到mutex
行,发现foo
已被t1
锁定,lock_guard
不会终止执行或抛出异常。 mutex
只是等待它被解锁。
t2
或t1
检查解锁的频率是多少?支票的费用是多少?支票的执行情况如下吗?
t1
答案 0 :(得分:4)
std :: mutex :: lock()或std :: lock_guard检查解锁的频率是多少次?
没有。它会在操作系统内部阻塞,直到资源被释放。任何通过旋转实现此操作的操作系统都会引起投诉。
答案 1 :(得分:2)
互斥体通常由操作系统提供,这意味着您的操作系统的线程模型负责所有这些。 C ++根本没有指定甚至实现这些细节。
因此,在某种程度上,它将取决于许多因素,例如所有进程的CPU负载,相对进程优先级,相对线程优先级......
为你提供一个明确的答案,即使这样的事情会有用,还有很多。