Метод unlock
Метод unlock класса unique_lock разблокирует мьютекс, связанный с объектом блокировки. Если объект unique_lock в данный момент не владеет мьютексом, вызов метода приводит к исключению std::system_error. Метод не принимает параметров и не возвращает значения. После вызова unlock объект unique_lock перестает владеть мьютексом, но сам объект остается связанным с ним, и его можно снова заблокировать с помощью метода lock.
Синтаксис
void unlock();
Пример
Давайте рассмотрим пример, где мы вручную блокируем и разблокируем мьютекс с помощью объекта unique_lock:
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
mutex mtx;
void print_message(int id)
{
unique_lock<mutex> lock(mtx, defer_lock);
lock.lock();
cout << "Thread " << id << " is working" << endl;
lock.unlock();
cout << "Thread " << id << " released the mutex" << endl;
}
int main()
{
thread t1(print_message, 1);
thread t2(print_message, 2);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода (порядок может меняться):
"Thread 1 is working"
"Thread 1 released the mutex"
"Thread 2 is working"
"Thread 2 released the mutex"
Пример
Давайте рассмотрим пример, где метод unlock вызывается для уже разблокированного мьютекса, что приводит к исключению:
#include <iostream>
#include <mutex>
using namespace std;
int main()
{
mutex mtx;
unique_lock<mutex> lock(mtx);
lock.unlock();
try
{
lock.unlock();
}
catch (const system_error& e)
{
cout << "Error: " << e.what() << endl;
}
return 0;
}
Результат выполнения кода:
"Error: Operation not permitted"
Смотрите также
-
класс
unique_lock,
который управляет блокировкой мьютекса -
метод
lock,
который блокирует мьютекс -
метод
try_lock,
который пытается заблокировать мьютекс без ожидания -
класс
lock_guard,
который автоматически блокирует и разблокирует мьютекс