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

std::mutex

Материал из 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)
Функции освобождения для атомарных операций
Функции освобождения для атомарных флагов
Упорядочивание памяти
Взаимное исключение
mutex
(C++11)
Общее управление блокировкой
(C++11)
(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)
(C++11)
 
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.

Класс mutex является некопируемым и неперемещаемым.

Содержание

[править] Типы-элементы

Тип-элемент Определение
native_handle_type (не всегда присутствует) определяется реализацией[править]

[править] Функции-элементы

создаёт мьютекс
(public функция-элемент) [править]
уничтожает мьютекс
(public функция-элемент) [править]
operator=
[удалено]
копирующее присваивание не возможно
(public функция-элемент) [править]
Блокировка
блокирует мьютекс, блокируется, если мьютекс недоступен
(public функция-элемент) [править]
пытается заблокировать мьютекс, возвращается, если мьютекс недоступен
(public функция-элемент) [править]
разблокирует мьютекс
(public функция-элемент) [править]
Встроенный дескриптор
возвращает базовый объект-дескриптор, определяемый реализацией
(public функция-элемент) [править]

[править] Примечание

К std::mutex обычно не обращаются напрямую: std::unique_lock, std::lock_guard или std::scoped_lock (начиная с C++17) управляют блокировкой более безопасным способом.

[править] Пример

В этом примере показано, как mutex можно использовать для защиты std::map, совместно используемого двумя потоками.

#include <iostream>
#include <map>
#include <string>
#include <chrono>
#include <thread>
#include <mutex>
 
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
 
void save_page(const std::string &url)
{
    // имитация получение длинной страницы
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::string result = "случайное содержимое";
 
    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();
 
    // безопасный доступ к g_pages без блокировки, так как потоки объединены
    for (const auto &pair : g_pages) {
        std::cout << pair.first << " => " << pair.second << '\n';
    }
}

Вывод:

http://bar => случайное содержимое
http://foo => случайное содержимое

[править] Смотрите также

предоставляет возможность взаимного исключения, которое может быть рекурсивно заблокировано одним и тем же потоком
(класс) [править]
реализует обёртку владения мьютексом строго в области видимости
(шаблон класса) [править]
реализует перемещаемую оболочку владения мьютексом
(шаблон класса) [править]
обёртка RAII для предотвращения взаимоблокировок для нескольких мьютексов
(шаблон класса) [править]
предоставляет условную переменную, связанную с std::unique_lock
(класс) [править]