mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
How frequently does mutex::lock() check for the unlocked state if it's already locked by another thread?
根据cppreference,使用std::mutex
参数构造std::lock_guard
会调用该mutex
的lock()
方法。
根据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
之前的等待时间更短。
我假设一旦线程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负载、相对进程优先级、相对线程优先级。。。
有太多的事情要给你一个明确的答案,即使这样的事情会很有用。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- C++将互斥锁锁定为来自另一个线程
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 如何确保我的进程永远不会将另一个进程锁定在文件之外
- 等待另一个进程锁定然后解锁 Win32 互斥锁
- 我怎样才能确保我可以读取文件,而不是被另一个进程锁定
- 是否有必要锁定一个仅从一个线程写入且仅从另一个线程读取的数组?
- shared_ptr.get()可以被多个线程调用,而另一个线程锁定并调用shared_ptr.swap()吗?
- Boost::mutex - 是否可以将其锁定在一个类函数中并在另一个类函数上解锁
- 快速锁定大量读取的变量,这些变量可能偶尔从另一个线程更改