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/w/cpp/thread/unique_lock/try_lock