Spec-Zone.ru › C++

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).

См. также

lock
блокирует (то есть получает владение) связанный мьютекс
(открытая функция-член)
try_lock_for
пытается заблокировать (то есть получить владение) связанный мьютекс TimedLockable; возвращает управление, если мьютекс был недоступен в течение указанного времени
(открытая функция-член)
try_lock_until
пытается заблокировать (то есть получить владение) связанный мьютекс TimedLockable; возвращает управление, если мьютекс оставался недоступным до наступления указанного момента времени
(открытая функция-член)
unlock
разблокирует (то есть освобождает владение) связанный мьютекс
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/unique_lock/try_lock

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API