次の 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;
}