std::lock – cppreference.com
Aus cppreference.com
<metanoindex/>
<tbody> </tbody>
| definiert in Header <mutex> |
||
|
|
(seit C++11) | |
Sperrt den gegebenen Lockable Objekten lock1, lock2, ..., lockn mit einem Deadlock Vermeidung Algorithmus zur Deadlock zu vermeiden .
Original:
Locks the given Lockable objects lock1, lock2, ..., lockn using a deadlock avoidance algorithm to avoid deadlock.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Die Objekte werden durch eine unbestimmte Reihe von Aufrufen lock gesperrt, try_lock, unlock. Wenn ein Aufruf an lock oder unlock führt zu einer Ausnahme wird unlock für alle gesperrten Objekte, bevor erneute Auslösen genannt .
Original:
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.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Parameter
| lock1, lock2, ... , lockn | - | Die Original: The text has been machine-translated via Google Translate. |
Rückgabewert
(None)
Original:
(none)
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Beispiel
Das folgende Beispiel verwendet std::lock auf Paare von Mutexe ohne Stillstand zu sperren .
Original:
The following example uses std::lock to lock pairs of mutexes without deadlock.
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> #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(); }
Siehe auch
Versuche, das Eigentum an Mutexe via wiederholten Aufforderungen an Original: attempts to obtain ownership of mutexes via repeated calls to The text has been machine-translated via Google Translate. (Funktions-Template) [edit] | |