如果mutex :: lock()已经被另一个线程锁定,它会多久检查一次解锁状态?

时间:2014-01-10 01:33:07

标签: c++ multithreading locking mutex stdthread

根据cppreference,使用std::lock_guard参数构建std::mutex会调用lock()的{​​{1}}方法。

根据cplusplus,关于mutex的{​​{1}}方法:

  

如果互斥锁被另一个线程锁定,则执行调用   线程被阻塞,直到另一个线程解锁...

我不确定这个名称问题的措辞是否正确,所以我将其置于以下代码的上下文中。

我想测试这个并查看调用线程是否实际等待解锁而不是终止其可调用的执行(例如函数,仿函数,lambda)和/或抛出异常。以下代码有两个线程mutexlock(),每个线程都使用指向同一函数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调用t2mutex行,发现foo已被t1锁定,lock_guard不会终止执行或抛出异常。 mutex只是等待它被解锁。

t2t1检查解锁的频率是多少?支票的费用是多少?支票的执行情况如下吗?

t1

2 个答案:

答案 0 :(得分:4)

  

std :: mutex :: lock()或std :: lock_guard检查解锁的频率是多少次?

没有。它会在操作系统内部阻塞,直到资源被释放。任何通过旋转实现此操作的操作系统都会引起投诉。

答案 1 :(得分:2)

互斥体通常由操作系统提供,这意味着您的操作系统的线程模型负责所有这些。 C ++根本没有指定甚至实现这些细节。

因此,在某种程度上,它将取决于许多因素,例如所有进程的CPU负载,相对进程优先级,相对线程优先级......

为你提供一个明确的答案,即使这样的事情会有用,还有很多。