std::unique_lock<Mutex>::try_lock
bool try_lock(); | (начиная с C++11) |
Пытается заблокировать (то есть получить владение) связанный мьютекс, не блокируя вызывающий поток. Фактически вызывает mutex()->try_lock().
Выбрасывается std::system_error, если связанный мьютекс отсутствует или если этот std::unique_lock уже заблокировал мьютекс.
Параметры
(нет)
Возвращаемое значение
true, если владение мьютексом успешно получено, иначе false.
Исключения
- Любые исключения, выброшенные
mutex()->try_lock()(типы Mutex не выбрасывают исключения вtry_lock, однако пользовательская реализация Lockable может их выбрасывать). - Если связанный мьютекс отсутствует, выбрасывается
std::system_errorс кодом ошибкиstd::errc::operation_not_permitted. - Если этот
std::unique_lockуже заблокировал мьютекс, выбрасываетсяstd::system_errorс кодом ошибкиstd::errc::resource_deadlock_would_occur.
Пример
В следующих примерах выполняется попытка получить доступ к мьютексу, который был заблокирован и разблокирован.
#include <chrono>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
using namespace std::chrono_literals;
int main()
{
std::mutex counter_mutex;
std::vector<std::thread> threads;
using Id = int;
auto worker_task = [&](Id id, std::chrono::seconds wait, std::chrono::seconds acquire)
{
// wait for a few seconds before acquiring lock.
std::this_thread::sleep_for(wait);
std::unique_lock<std::mutex> lock(counter_mutex, std::defer_lock);
if (lock.try_lock())
std::cout << '#' << id << ", lock acquired.\n";
else
{
std::cout << '#' << id << ", failed acquiring lock.\n";
return;
}
// keep the lock for a while.
std::this_thread::sleep_for(acquire);
std::cout << '#' << id << ", releasing lock (via destructor).\n";
};
threads.emplace_back(worker_task, Id{0}, 0s, 2s);
threads.emplace_back(worker_task, Id{1}, 1s, 0s);
threads.emplace_back(worker_task, Id{2}, 3s, 0s);
for (auto& thread : threads)
thread.join();
}
Вывод:
#0, lock acquired. #1, failed acquiring lock. #0, releasing lock (via destructor). #2, lock acquired. #2, releasing lock (via destructor).
См. также
| блокирует (то есть получает владение) связанный мьютекс (открытая функция-член) |
|
| пытается заблокировать (то есть получить владение) связанный мьютекс TimedLockable; возвращает управление, если мьютекс был недоступен в течение указанного времени (открытая функция-член) |
|
| пытается заблокировать (то есть получить владение) связанный мьютекс TimedLockable; возвращает управление, если мьютекс оставался недоступным до наступления указанного момента времени (открытая функция-член) |
|
| разблокирует (то есть освобождает владение) связанный мьютекс (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/unique_lock/try_lock