boost::lock_guard分配、构造函数和析构函数开销

boost::lock_guard allocation, constructor, and destructor overhead

本文关键字:构造函数 开销 析构函数 分配 lock guard boost      更新时间:2023-10-16

我正在学习互斥锁,我看到,要使用锁保护,每次迭代都必须为锁保护分配内存,调用构造函数,然后调用析构函数。与永远不会超出范围的锁相比,这似乎可能是大量的开销。我了解锁罩的优势,但是通过避免它们,我可以节省多少时间?或者,换句话说,线程每次迭代的工作必须有多小才能使锁保护开销显着?

prepare_data();
{
    boost::lock_guard<boost::mutex> lock(mut);
    data_ready=true;
}
cond.notify_one();

不需要分配。编译器可以准确地看到构造函数和析构函数的作用,并优化任何内存分配或对象初始化的需求,或者调用特定构造函数或析构函数的任何需求。

它可以看到构造函数只调用互斥锁的锁定函数,析构函数只调用解锁函数。lock_guard的地址永远不会被占用,因此不需要。

这是C++推荐RAII的关键原因之一 - 它通常没有任何成本。

编译器很可能必须在堆栈上分配空间来存储对lock_guard析构函数的互斥锁的引用。它不太可能缓存它,因为 (a) 锁定/解锁互斥锁是外部函数调用,以及 (b) 函数施加内存围栏。但是锁定/解锁互斥锁的成本远高于与lock_guard相关的其他操作,因此没有实际理由避免它。此外,现代编译器在堆栈管理方面具有非常有效的技术,并且为引用分配空间实际上可能是一个无操作。