繁体   English   中英

如果互斥锁:: lock()已经被另一个线程锁定,则多久检查一次其未锁定状态?

[英]How frequently does mutex::lock() check for the unlocked state if it's already locked by another thread?

cppreference ,构建std::lock_guardstd::mutex参数调用lock()该方法mutex

根据cplusplus ,关于mutexlock()方法:

如果互斥锁被另一个线程锁定,则调用线程的执行将被阻止,直到被另一个线程解锁为止。

我不确定标题问题的措词是否正确,因此将其放在以下代码的上下文中。

我想测试一下,看看调用线程是否实际上在等待解锁,而不是终止其可调用对象(例如函数,函子,lambda)的执行和/或引发异常。 以下代码具有两个线程t1t2 ,每个线程都由指向同一函数foo的指针构成。 在执行锁定保护的代码之前,每次对foo调用都会sleep_for一定的时间(由foounsigned参数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的等待时间较短。

我假设一旦线程t1foo的调用到达了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM