std::lock
Материал из cppreference.com
![]() | Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
Определено в заголовочном файле <mutex> | ||
template<class Lockable1, class Lockable2, class LockableN... > void lock( Lockable1& lock1, Lockable2& lock2, LockableN& lockn... ); | (начиная с C++11) | |
Замки данного
Lockable
объектов lock1
, lock2
, ...
, lockn
с использованием алгоритма тупик избежании чтобы избежать тупика.Оригинал:
Locks the given
Lockable
objects lock1
, lock2
, ...
, lockn
using a deadlock avoidance algorithm to avoid deadlock.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Объекты заблокированы неопределенный серии вызовов
lock
, try_lock
, unlock
. Если вызов lock
или unlock
результатов исключением, unlock
называется закрывается для любых объектов до Повторный вызов.Оригинал:
The objects are locked by an unspecified series of calls to
lock
, try_lock
, unlock
. If a call to lock
or unlock
results in an exception, unlock
is called for any locked objects before rethrowing.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Содержание |
[править]Параметры
lock1, lock2, ... , lockn | — | Lockable объекты для блокировкиОригинал: the Lockable objects to lockТекст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
[править]Возвращаемое значение
(Нет)
[править]Пример
В следующем примере используется
std::lock
, чтобы заблокировать пар мьютексы без тупик . Оригинал:
The following example uses
std::lock
to lock pairs of mutexes without deadlock. Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Запустить этот код
#include <mutex>#include <thread>#include <iostream>#include <vector>#include <functional>#include <chrono> struct Employee { Employee(int id): id(id){}int id;std::vector<int> lunch_partners;std::mutex m;}; void send_mail(Employee &e1, Employee &e2){// simulate a time-consuming messaging operationstd::this_thread::sleep_for(std::chrono::seconds(1));} void assign_lunch_partner(Employee &e1, Employee &e2){// use std::lock to acquire two locks without worrying about// other calls to assign_lunch_partner deadlocking us std::lock(e1.m, e2.m); e1.lunch_partners.push_back(e2.id); e2.lunch_partners.push_back(e1.id); e1.m.unlock(); e2.m.unlock(); send_mail(e1, e2); send_mail(e2, e1);} int main(){ Employee alice(0), bob(1), christina(2), dave(3); // assign in parallel threads because mailing users about lunch assignments// takes a long timestd::vector<std::thread> threads; threads.emplace_back(assign_lunch_partner, std::ref(alice), std::ref(bob)); threads.emplace_back(assign_lunch_partner, std::ref(christina), std::ref(bob)); threads.emplace_back(assign_lunch_partner, std::ref(christina), std::ref(alice)); threads.emplace_back(assign_lunch_partner, std::ref(dave), std::ref(bob)); for(auto&thread : threads) thread.join();}
[править]См. также
(C++11) | пытается получить право собственности на мьютексы через повторяющиеся вызовы try_lock (шаблон функции) |