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