【发布时间】:2011-03-13 02:46:22
【问题描述】:
考虑以下 C++ 成员函数:
size_t size() const
{
boost::lock_guard<boost::mutex> lock(m_mutex);
return m_size;
}
这里的目的不是同步对私有成员变量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;
}
【问题讨论】:
-
我不认为你的锁真的有任何作用。只要可以在单个原子操作中完整读取
m_size,您就会得到一个有效值。 -
这实际上并不能保证。但是使用 C++0x 附带的
std::atomic可以确保这一点没有锁定。 -
@Mike:锁也是一个内存屏障。这是同步处理器缓存等所需要的。
标签: c++ multithreading boost-thread thread-safety