2017-01-14 3 views
0

Являются ли эти два сегмента кода одинаковыми? Я думаю, что это происходит, если нет чего-то, что мне не хватает. Примечание: Я использовал этот указатель везде только уточнить, что все переменные являются переменными члены some_classboost scoped_lock return поведение

int some_class::some_func() 
{ 
    boost::scoped_lock lock(this->m_mutex); 
    return this->member; 
} 

int some_class::some_func() 
{ 
    this->m_mutex.lock(); 
    int a = this->member; 
    this->m_mutex.unlock(); 
    return a; 
} 

ответ

0

Это же при условии, что int a = this->member; не исключение.

+0

спасибо. Согласитесь с примечанием об исключении. Я приму ответ – yaGsd

1

Некоторые из них выполняют одну и ту же работу: это не просто забыть позвонить unlock(): может произойти исключение, если ваш мьютекс заблокирован, и ваш вызов unlock() может никогда не быть достигнут, даже если вы этого не сделаете иметь любой оператор возврата между вашим вызовом lock() и вашим вызовом unlock(); нравится:

m.lock() // m is a mutex 
    // do something 
    foo(); // If this throws an exception,that your mutex won't get unlocked 
    // do something 
    m.unlock() 

Bur в случае scoped_lock, деструктор scoped_lock охранника будет вызываться во время стек разматывания, убедившись, что связанный мьютекс всегда освобождается.

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