std::lock_guard 怎么可能比 std::mutex::lock() 更快?
How can std::lock_guard be faster than std::mutex::lock()?
我和一位同事争论了大约lock_guard,他提出lock_guard可能比mutex::lock((/mutex::unlock((慢,因为实例化和取消类lock_guard的成本。
然后我创建了这个简单的测试,令人惊讶的是,带有 lock_guard 的版本几乎比带有 mutex::lock((/mutex::unlock(( 的版本快两倍
#include <iostream>
#include <mutex>
#include <chrono>
std::mutex m;
int g = 0;
void func1()
{
m.lock();
g++;
m.unlock();
}
void func2()
{
std::lock_guard<std::mutex> lock(m);
g++;
}
int main()
{
auto t = std::chrono::system_clock::now();
for (int i = 0; i < 1000000; i++)
{
func1();
}
std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl;
t = std::chrono::system_clock::now();
for (int i = 0; i < 1000000; i++)
{
func2();
}
std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl;
return 0;
}
我机器上的结果:
Take: 41 ms
Take: 22 ms
有人可以澄清为什么以及如何这样做吗?
发布版本为两个版本生成相同的结果。
DEBUG
构建显示func2
的时间延长了 ~33%;我在反汇编中看到的差异func2
使用__security_cookie
并调用@_RTC_CheckStackVars@8
。
你正在计时调试吗?
编辑: 此外,在查看RELEASE
反汇编时,我注意到mutex
方法保存在两个注册表中:
010F104E mov edi,dword ptr [__imp___Mtx_lock (010F3060h)]
010F1054 xor esi,esi
010F1056 mov ebx,dword ptr [__imp___Mtx_unlock (010F3054h)]
并从func1
和func2
中以相同的方式调用:
010F1067 call edi
....
010F107F call ebx
相关文章:
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- std::lock 仍然导致死锁
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 当我调用lock()时,为什么std :: mutex会引发异常
- 使用 std::lock (c++11) 的大量 CPU 负载
- std::lock() equivalent for boost::shared_mutex?
- 为什么在 std::lock 中没有超时支持
- “std::mutex”和“std::lock”是否保证处理器间代码中的内存同步
- std::weak_ptr:lock或shared_ptr构造函数
- std::mutex::lock可以抛出即使一切看起来"good"?
- std::weak_ptr.lock在多线程c++中的语义
- STD::Lock 的友元函数定义和替代提升函数
- 什么是更好的 std::lock_guard<std::mutex> lock(std::mutex mutex_var); 或 std::mutex mutex_var.lock();
- 尝试std::lock[_unique]和std::shared_mutex的线程是否会被调用std::lock_sha
- C++std::lock和std::unique_lock之间有什么区别