Класс timed_mutex
Класс timed_mutex - это механизм синхронизации, который
расширяет возможности обычного мьютекса. В отличие от
mutex, он позволяет потоку пытаться захватить блокировку
в течение определенного промежутка времени. Если за это время
ресурс не освободился, поток продолжает работу, не дожидаясь
бесконечно. Класс предоставляет методы lock,
try_lock, try_lock_for, try_lock_until
и unlock.
Синтаксис
#include <mutex>
std::timed_mutex mtx;
mtx.lock();
mtx.try_lock_for(duration);
mtx.try_lock_until(time_point);
mtx.unlock();
Пример
Давайте рассмотрим пример, где один поток захватывает
блокировку и удерживает ее 2 секунды, а второй поток
пытается захватить блокировку с таймаутом в 1 секунду:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
timed_mutex mtx;
void worker1()
{
mtx.lock();
cout << "worker1 locked" << endl;
this_thread::sleep_for(chrono::seconds(2));
mtx.unlock();
cout << "worker1 unlocked" << endl;
}
void worker2()
{
this_thread::sleep_for(chrono::milliseconds(100));
if (mtx.try_lock_for(chrono::seconds(1))) {
cout << "worker2 locked" << endl;
mtx.unlock();
} else {
cout << "worker2 timeout" << endl;
}
}
int main()
{
thread t1(worker1);
thread t2(worker2);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"worker1 locked"
"worker2 timeout"
"worker1 unlocked"
Пример
Давайте рассмотрим пример, где второй поток успешно захватывает блокировку, так как первый поток удерживает ее меньше времени, чем заданный таймаут:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
timed_mutex mtx;
void worker1()
{
mtx.lock();
cout << "worker1 locked" << endl;
this_thread::sleep_for(chrono::milliseconds(500));
mtx.unlock();
cout << "worker1 unlocked" << endl;
}
void worker2()
{
this_thread::sleep_for(chrono::milliseconds(100));
if (mtx.try_lock_for(chrono::seconds(1))) {
cout << "worker2 locked" << endl;
mtx.unlock();
} else {
cout << "worker2 timeout" << endl;
}
}
int main()
{
thread t1(worker1);
thread t2(worker2);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"worker1 locked"
"worker2 locked"
"worker1 unlocked"
Смотрите также
-
класс
mutex,
который представляет обычный мьютекс -
метод
lock,
который блокирует мьютекс -
метод
try_lock,
который пытается заблокировать мьютекс -
класс
recursive_mutex,
который допускает повторную блокировку