同步对返回值的访问

Cha*_*l72 14 c++ multithreading thread-safety boost-thread

考虑以下C++成员函数:

 size_t size() const
 {
    boost::lock_guard<boost::mutex> lock(m_mutex);
    return m_size;
 }
Run Code Online (Sandbox Code Playgroud)

这里的目的不是同步对私有成员变量的访问m_size,而只是为了确保调用者收到m_size的有效值.目标是防止函数m_size在某些其他线程正在修改的同时返回m_size.

但调用此功能是否涉及任何潜在的竞争条件?我不确定这里的RAII风格锁是否足以抵御竞争条件.假设在将函数的返回值压入堆栈之前调用了锁的析构函数?

我是否需要执行以下操作以确保线程安全?

 size_t size() const
 {
    size_t ret;

    {
      boost::lock_guard<boost::mutex> lock(m_mutex);
      ret = m_size;
    }

    return ret;
 }
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 12

您的两个示例构造都将执行您正在寻找的内容.标准中的以下信息支持您正在寻找的行为(即使在第一个示例中):

12.4/10析构函数:

对于具有自动存储持续时间(3.7.2)的构造对象,当创建对象的块退出时,将隐式调用析构函数.

并且,6.6/2跳转语句(其中return一个):

在从范围退出(但是已完成)时,将为所有具有自动存储持续时间(3.7.2)(命名对象或临时值)的构造对象调用析构函数(12.4),这些对象在其范围内声明,其声明的顺序与其声明的顺序相反.从循环中移出一个循环,或者从具有自动存储持续时间的初始化变量返回过去涉及销毁具有自动存储持续时间的变量,这些变量在转移点但不在转移点处的范围内.

因此,在这点returnlock变量范围,因此析构函数没有被调用.一旦return已经执行,对于该析构函数lock变量被称为(从而释放锁定).