std::mutex
Определено в заголовке <mutex> | ||
|---|---|---|
class mutex; | (с C++11) |
Класс mutex — это примитив синхронизации, который может быть использован для защиты общих данных от одновременного доступа нескольких потоков.
mutex обеспечивает семантику исключительной, нерекурсивной владения:
- Вызывающий поток владеет
mutexс момента успешного вызова либоlock, либоtry_lockдо вызоваunlock. - Когда поток владеет
mutex, все остальные потоки будут блокироваться (при вызовахlock) или получать значениеfalse(при вызовахtry_lock) при попытке получить владение надmutex. - Вызывающий поток не должен владеть
mutexперед вызовомlockилиtry_lock.
Поведение программы не определено, если mutex уничтожается, пока им всё ещё владеет какой-либо поток, или поток завершается, пока он владеет mutex. Класс mutex удовлетворяет всем требованиям Mutex и StandardLayoutType.
std::mutex не является копируемым и неперемещаемым.
Типы членов
| Тип члена | Определение |
|---|---|
native_handle_type(не всегда присутствует) | определяется реализацией |
Члены-функции
| создаёт мьютекс (общедоступная функция-член) |
|
| уничтожает мьютекс (общедоступная функция-член) |
|
| operator=
[удалено] | не может быть присваиваемым по значению (общедоступная функция-член) |
Блокировка |
|
| блокирует мьютекс, блокируется, если мьютекс недоступен (общедоступная функция-член) |
|
| пытается заблокировать мьютекс, возвращает значение, если мьютекс недоступен (общедоступная функция-член) |
|
| разблокирует мьютекс (общедоступная функция-член) |
|
Нативный дескриптор |
|
| возвращает объект нативного дескриптора реализации (общедоступная функция-член) |
|
Примечания
std::mutex обычно не обращается к нему напрямую: std::unique_lock, std::lock_guard, или std::scoped_lock(с C++17) управляют блокировкой более безопасным способом с точки зрения исключений.
Пример
Этот пример показывает, как mutex может быть использован для защиты std::map общих данных между двумя потоками.
#include <chrono>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include <thread>
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
void save_page(const std::string& url)
{
// simulate a long page fetch
std::this_thread::sleep_for(std::chrono::seconds(2));
std::string result = "fake content";
std::lock_guard<std::mutex> guard(g_pages_mutex);
g_pages[url] = result;
}
int main()
{
std::thread t1(save_page, "http://foo");
std::thread t2(save_page, "http://bar");
t1.join();
t2.join();
// safe to access g_pages without lock now, as the threads are joined
for (const auto& pair : g_pages)
std::cout << pair.first << " => " << pair.second << '\n';
}Вывод:
http://bar => fake content http://foo => fake content
См. также
|
(C++11) | предоставляет механизм взаимного исключения, который может быть заблокирован рекурсивно тем же потоком (класс) |
|
(C++11) | реализует оболочку владения мьютексом, основанную на строгом объеме (шаблон класса) |
|
(C++11) | реализует переместимый обёртку владения мьютексом (шаблон класса) |
|
(C++17) | оболочка RAII для предотвращения тупиков при работе с несколькими мьютексами (шаблон класса) |
|
(C++11) | предоставляет переменную условия, связанную с std::unique_lock (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/mutex