2010-10-04 4 views
15

У меня есть вопрос относительно использования boost::lock_guard (или аналогичных блокировок) и использования переменных, которые должны быть защищены блокировкой в ​​инструкции return.Как использовать lock_guard при возврате защищенных данных

Как осуществляется уничтожение локальных объектов и копирование возвращаемого значения? Как оптимизация возвращаемого значения влияет на это?

Пример:

Data Class::GetData() 
{ 
    boost::lock_guard<boost::mutex> lock(this->mMutex); 
    return this->mData; 
} 

Будет ли это правильно (если mData переменная защищена mMutex)? Или я должен использовать локальную область видимости и временное, как показано в примере ниже:

Data Class::GetData() 
{ 
    Data ret; 
    { 
     boost::lock_guard<boost::mutex> lock(this->mMutex); 
     ret = this->mData; 
    } 
    return ret; 
} 

ответ

18

Просто прямой возврат, как и в первом примере является правильным. Возвращаемое значение создается до того, как локальные переменные будут уничтожены, и, таким образом, до освобождения блокировки.

0

Обе части являются эквивалентными. Фактически для случая # 1 - компилятор C++ создаст структуру, описанную в случае №2. Поэтому № 1 предпочтительнее.

3

Как осуществляется уничтожение локальных объектов и копирование возвращаемого значения?

Как правило, объекты стека уничтожаются в обратном порядке создания. Как указано выше, оба указанных вами подхода обеспечат желаемое поведение.

Каким образом оптимизация возвращаемого значения влияет на это?

RVO не должен вызывать беспокойства здесь - все это делает конструкцию выходного объекта непосредственно в буфер кадра стека - избегая накладных расходов на создание именованного временного объекта (как в вашем втором примере выше). Это делается до вызова локальных деструкторов.

Лучше всего использовать код примера 1 выше.

Смежные вопросы