Метод try_lock
Метод try_lock класса mutex пытается
захватить мьютекс. В отличие от метода lock,
он не блокирует поток выполнения, если мьютекс уже
захвачен другим потоком. Метод не принимает параметров.
Он возвращает true, если захват произошел успешно,
и false, если мьютекс уже занят.
Если метод вернул true, поток становится
владельцем мьютекса, и его необходимо освободить
с помощью метода unlock. Если метод вернул
false, вызывающий поток не владеет мьютексом,
и вызывать unlock нельзя.
Синтаксис
mutex.try_lock()
Пример
Давайте создадим мьютекс и попробуем захватить его
дважды из одного потока. Первый вызов вернет
true, а второй - false, так как
мьютекс уже занят:
#include <iostream>
#include <mutex>
using namespace std;
int main()
{
mutex mtx;
bool res1 = mtx.try_lock();
cout << "First try: " << res1 << endl;
bool res2 = mtx.try_lock();
cout << "Second try: " << res2 << endl;
mtx.unlock();
return 0;
}
Результат выполнения кода:
"First try: 1"
"Second try: 0"
Пример
Давайте рассмотрим использование метода try_lock
в двух потоках. Первый поток захватит мьютекс и будет
удерживать его некоторое время, а второй поток
попытается захватить мьютекс и получит отказ:
#include <iostream>
#include <mutex>
#include <thread>
#include <chrono>
using namespace std;
mutex mtx;
void worker(int id)
{
if (mtx.try_lock()) {
cout << "Thread " << id << " locked" << endl;
this_thread::sleep_for(chrono::milliseconds(500));
mtx.unlock();
cout << "Thread " << id << " unlocked" << endl;
} else {
cout << "Thread " << id << " failed to lock" << endl;
}
}
int main()
{
thread t1(worker, 1);
this_thread::sleep_for(chrono::milliseconds(50));
thread t2(worker, 2);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"Thread 1 locked"
"Thread 2 failed to lock"
"Thread 1 unlocked"
Смотрите также
-
класс
mutex,
который представляет собой примитив синхронизации -
метод
lock,
который блокирует поток до захвата мьютекса -
метод
unlock,
который освобождает захваченный мьютекс -
класс
lock_guard,
который автоматически управляет захватом мьютекса