gpt4 book ai didi

c++ - std::lock_guard 如何比 std::mutex::lock() 更快?

转载 作者:行者123 更新时间:2023-12-01 23:19:56 26 4
gpt4 key购买 nike

我和一位同事争论了 lock_guard 的问题,他提出,由于实例化和取消实例化类 lock_guard 的成本,lock_guard 可能比 mutex::lock()/mutex::unlock() 慢。

然后我创建了这个简单的测试,令人惊讶的是,使用 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++ - std::lock_guard 如何比 std::mutex::lock() 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com