Je discutais avec un collègue à propos de lock_guard, et il a proposé que lock_guard soit probablement plus lent que mutex :: lock () / mutex :: unlock () en raison du coût d'instanciation et de non-différenciation de la classe lock_guard.
Ensuite, j'ai créé ce test simple et, étonnamment, la version avec lock_guard est presque deux fois plus rapide que la version avec 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;
}Les résultats sur ma machine:
Take: 41 ms
Take: 22 msQuelqu'un peut-il clarifier pourquoi et comment cela peut être?
std::lock_guardétait un peu plus lent, à moins que vous ne puissiez prouver qu'il est important en termes de performances, ce gain de vitesse n'invalidera pas les autres avantages de l'utilisation std::lock_guard(principalement RAII). Si g++quelque chose qui peut jeter ou tout ce qui pourrait se transformer en quelque chose de potentiellement plus compliqué à l'avenir vous presque devez utiliser une sorte d'objet à posséder la serrure.