std::defer_lock, std::try_to_lock, std::adopt_lock
Материал из cppreference.com
|
|
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
| constexpr std::defer_lock_t defer_lock = std::defer_lock_t(); |
(начиная с C++11) | |
| constexpr std::try_to_lock_t try_to_lock = std::try_to_lock_t(); |
(начиная с C++11) | |
| constexpr std::adopt_lock_t adopt_lock = std::adopt_lock_t(); |
(начиная с C++11) | |
std::defer_lock, std::try_to_lock and std::adopt_lock are instances of empty struct tag types std::defer_lock_t, std::try_to_lock_t and std::adopt_lock_t respectively.
They are used to specify locking strategies for std::lock_guard and std::unique_lock.
| Type
Original: Type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
Effect(s) |
defer_lock_t
|
не приобретают права собственности на мьютекс
Original: do not acquire ownership of the mutex The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
try_to_lock_t
|
попробуйте приобрести в собственность мьютекса без блокирования
Original: try to acquire ownership of the mutex without blocking The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
adopt_lock_t
|
Предположим, вызывающий поток уже имеет собственность на мьютекс
Original: assume the calling thread already has ownership of the mutex The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
[править] Пример
#include <mutex> #include <thread> struct bank_account { explicit bank_account(int balance) : balance(balance) {} int balance; std::mutex m; }; void transfer(bank_account &from, bank_account &to, int amount) { // attempt to lock both mutexes without deadlock std::lock(from.m, to.m); // make sure both already-locked mutexes are unlocked when // we're done; if we just used the lock_guard without std::lock // and std::adopt_lock, we might deadlock with other calls to transfer std::lock_guard lock1(from.m, std::adopt_lock); std::lock_guard lock2(to.m, std::adopt_lock); from.balance -= amount; to.balance += amount; } int main() { bank_account my_account(100); bank_account your_account(50); std::thread t1(transfer, my_account, your_account, 10); std::thread t2(transfer, your_account, my_account, 5); t1.join(); t2.join(); }
[править] См. также
| тип тега используется для указания замок стратегии Original: tag type used to specify locking strategy The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (класс) | |
| строит lock_guard, необязательно блокировки данного мьютекса Original: constructs a lock_guard, optionally locking the given mutex The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (public функция-член std::lock_guard)
| |
| строит unique_lock, необязательно блокировки поставляется мьютекс Original: constructs a unique_lock, optionally locking the supplied mutex The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (public функция-член std::unique_lock)
| |