std::mutex::try_lock
bool try_lock(); | (начиная с C++11) |
Пытается заблокировать мьютекс. Возвращает управление немедленно. При успешной блокировке возвращает true, в противном случае возвращает false.
Эта функция может завершиться неудачей без видимой причины и вернуть false, даже если в данный момент мьютекс не заблокирован ни одним другим потоком.
Если try_lock вызывается потоком, который уже владеет mutex, поведение не определено.
Предшествующая операция unlock() над тем же мьютексом синхронизируется-с (в соответствии с определением в std::memory_order) этой операцией, если она возвращает true. Обратите внимание, что предшествующая операция lock() не синхронизируется с этой операцией, если она возвращает false.
Параметры
(нет)
Возвращаемое значение
true, если блокировка успешно получена, в противном случае false.
Исключения
Не выбрасывает исключений.
Пример
#include <chrono>
#include <iostream> // std::cout
#include <mutex>
#include <thread>
std::chrono::milliseconds interval(100);
std::mutex mutex;
int job_shared = 0; // both threads can modify 'job_shared',
// mutex will protect this variable
int job_exclusive = 0; // only one thread can modify 'job_exclusive'
// no protection needed
// this thread can modify both 'job_shared' and 'job_exclusive'
void job_1()
{
std::this_thread::sleep_for(interval); // let 'job_2' take a lock
while (true)
{
// try to lock mutex to modify 'job_shared'
if (mutex.try_lock())
{
std::cout << "job shared (" << job_shared << ")\n";
mutex.unlock();
return;
}
else
{
// can't get lock to modify 'job_shared'
// but there is some other work to do
++job_exclusive;
std::cout << "job exclusive (" << job_exclusive << ")\n";
std::this_thread::sleep_for(interval);
}
}
}
// this thread can modify only 'job_shared'
void job_2()
{
mutex.lock();
std::this_thread::sleep_for(5 * interval);
++job_shared;
mutex.unlock();
}
int main()
{
std::thread thread_1(job_1);
std::thread thread_2(job_2);
thread_1.join();
thread_2.join();
}
Возможный вывод:
job exclusive (1) job exclusive (2) job exclusive (3) job exclusive (4) job shared (1)
См. также
| блокирует мьютекс; если мьютекс недоступен, ожидает (открытая функция-член) |
|
| разблокирует мьютекс (открытая функция-член) |
|
Документация C для mtx_trylock |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/mutex/try_lock