Подтвердить что ты не робот

Является ли Boost Thread boost:: unique_lock скопированной блокировкой?

Я понимаю, что переменная, заблокированная boost::mutex::scoped_lock, автоматически разблокируется, когда она выходит за рамки.

Как насчет boost::unique_lock, он автоматически разблокирует переменную, когда она выходит за пределы области видимости?

Можно ли также указать ссылку на эту функцию.

double x;
boost::mutex x_mutex;

void foo() 
{
    {
         boost::unique_lock<boost::mutex> lock(x_mutex);
         x = rand();
    }    
    ...... some calculation which takes 10 second ......
    ...... is x still locked here??? ......    
}

Спасибо.

4b9b3361

Ответ 1

scoped_lock является unique_lock. В mutex.hpp:

typedef unique_lock<mutex> scoped_lock;

Деструктор вызывает unlock(), если блокировка была получена. Таким образом, он будет выпущен, когда он выходит за рамки.

См. http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html

не только обеспечивает блокировку в стиле RAII, но также позволяет отложить получение блокировки до тех пор, пока функция элемента lock() не будет вызвана явно или не попытается получить блокировку неблокирующим образом или с тайм-аутом, Следовательно, unlock() вызывается только в деструкторе, если объект блокировки заблокировал объект Lockable или иным образом принял блокировку объекта Lockable.