std::mutex:: try_lock
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
|
mutex::try_lock
|
||||
| Native handle | ||||
|
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; // обе нити могут изменять 'job_shared', // мьютекс защитит эту переменную int job_exclusive = 0; // только одна нить может изменять 'job_exclusive' // защита не требуется // эта нить может изменять и 'job_shared', и 'job_exclusive' void job_1() { std::this_thread::sleep_for(interval); // позволить 'job_2' захватить блокировку while (true) { // попытаться заблокировать мьютекс для изменения 'job_shared' if (mutex.try_lock()) { std::cout << "job shared (" << job_shared << ")\n"; mutex.unlock(); return; } else { // не удалось получить блокировку для изменения 'job_shared' // но есть другая работа для выполнения ++job_exclusive; std::cout << "job exclusive (" << job_exclusive << ")\n"; std::this_thread::sleep_for(interval); } } } // эта нить может изменять только '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 documentation
для
mtx_trylock
|
|