在 Visual Studio 2022 中以 Release 模式运行了以下命令:
#include <chrono>
#include <mutex>
#include <shared_mutex>
#include <iostream>
std::mutex mx;
std::shared_mutex smx;
constexpr int N = 100'000'000;
int main()
{
auto t1 = std::chrono::steady_clock::now();
for (int i = 0; i != N; i++)
{
std::unique_lock<std::mutex> l{ mx };
}
auto t2 = std::chrono::steady_clock::now();
for (int i = 0; i != N; i++)
{
std::unique_lock<std::shared_mutex> l{ smx };
}
auto t3 = std::chrono::steady_clock::now();
auto d1 = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
auto d2 = std::chrono::duration_cast<std::chrono::duration<double>>(t3 - t2);
std::cout << "mutex " << d1.count() << "s; shared_mutex " << d2.count() << "s\n";
std::cout << "mutex " << sizeof(mx) << " bytes; shared_mutex " << sizeof(smx) << " bytes \n";
}
输出结果如下:
mutex 2.01147s; shared_mutex 1.32065s
mutex 80 bytes; shared_mutex 8 bytes
为什么呢?
出人意料的是,拥有更多特性的std::shared_mutex
比其严格子集std::mutex
更快。
24 ns
,std::mutex75-85 ns
,std::shared_mutex42-45 ns
。 - Artystore
和memory_order_release
,你只需要释放它。但是互斥量将执行一个交换操作(很可能是exchange
),以查看是否需要通知一些等待线程。 (x86有带有memory_order_release
的廉价存储器,但任何exchange
都不便宜,即使是_relaxed
) - Alex Guteniev