std :: lock_guard如何比std :: mutex :: lock()?

问题描述 投票:5回答:1

[我正在和一位同事争论关于lock_guard,并且他认为,由于实例化和取消使class lock_guard的成本高昂,lock_guard可能比Mutex :: lock()/ Mutex :: unlock()慢。

然后我创建了这个简单的测试,令人惊讶的是,具有lock_guard的版本比具有互斥锁:: lock()/互斥锁:: 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

有人可以阐明原因和方式吗?

我正在和一位同事争论关于lock_guard,并且他认为lock_guard可能比Mutex :: lock()/ Mutex :: unlock()慢,原因是实例化和取消类的开销...

c++ mutex
1个回答
3
投票

发行版对两个版本产生相同的结果。

DEBUG版本显示func2的时间增加了〜33%;我在反汇编中看到的差异是func2使用__security_cookie并调用@_RTC_CheckStackVars@8

© www.soinside.com 2019 - 2024. All rights reserved.