Пространства имён
Варианты
Действия

std::lock

Материал из cppreference.com
< cpp‎ | thread

 
 
Библиотека поддержки конкуренции
Ветви
(C++11)
(C++20)
(C++20)
Пространство имён this_thread
(C++11)
(C++11)
(C++11)
Атомарные типы
(C++11)
(C++20)
Инициализация атомарных типов
(C++11)(устарело в C++20)
(C++11)(устарело в C++20)
(C++11)(устарело в C++20)
Функции освобождения для атомарных операций
Функции освобождения для атомарных флагов
Упорядочивание памяти
Взаимное исключение
Общее управление блокировкой
lock
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Условные переменные
(C++11)
Семафоры
Защёлки и барьеры
(C++20)
(C++20)
Фьючерсы
(C++11)
(C++11)
(C++11)
 
Определено в заголовочном файле <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
(шаблон функции)[править]
close