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