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

时间:2016-02-27 00:55:51

标签: c++ multithreading boost locking mutex

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

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

2 个答案:

答案 0 :(得分:3)

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

可以看到构造函数除了调用互斥锁的锁定函数之外什么都不做,并且析构函数除了调用解锁函数之外什么都不做。永远不会使用lock_guard的地址,因此不需要。{/ p>

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

答案 1 :(得分:1)

编译器很可能必须在堆栈上分配空间来存储对lock_guard析构函数的互斥锁的引用。它不太可能缓存它,因为(a)锁定/解锁互斥锁是外部函数调用和(b)函数强加内存栅栏。但是锁定/解锁互斥锁的成本比与lock_guard相关的其他操作要大得多,因此没有实际的理由可以避免它。此外,现代编译器在堆栈管理方面拥有非常有效的技术,为参考分配空间实际上可能是无操作。