Namespaces
Variants

std:: mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовке <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 ( опционально* ) определяется реализацией

Функции-члены

создает мьютекс
(public member function)
уничтожает мьютекс
(public member function)
operator=
[deleted]
не копируемый
(public member function)
Блокировка
блокирует мьютекс, ожидает если мьютекс недоступен
(public member function)
пытается заблокировать мьютекс, возвращает управление если мьютекс недоступен
(public member function)
разблокирует мьютекс
(public member function)
Нативный дескриптор
возвращает базовый объект нативного дескриптора, определенный реализацией
(public member function)

Примечания

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& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

Вывод:

http://bar => fake content
http://foo => fake content

Смотрите также

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