考慮下面的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'可以在單個原子操作中完整讀取,就會得到一個有效的值。 – 2010-07-08 01:29:46
這實際上並不能保證。然而,使用C++ 0x附帶的'std :: atomic'可以確保不鎖定。 – 2010-07-08 06:38:57
@Mike:鎖也是一種記憶障礙。這需要同步處理器緩存等。 – sbi 2010-07-08 09:08:56