std::lock
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
<metanoindex/>
<tbody> </tbody>| Определено в заголовочном файле <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 operation
std::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 time
std::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 (шаблон функции) |