Рассмотрим следующую функцию-член 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;
}