Spec-Zone.ru › C++

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=
[удалено]
не может быть присваиваемым по значению
(общедоступная функция-член)
Блокировка
lock
блокирует мьютекс, блокируется, если мьютекс недоступен
(общедоступная функция-член)
try_lock
пытается заблокировать мьютекс, возвращает значение, если мьютекс недоступен
(общедоступная функция-член)
unlock
разблокирует мьютекс
(общедоступная функция-член)
Нативный дескриптор
native_handle
возвращает объект нативного дескриптора реализации
(общедоступная функция-член)

Примечания

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

См. также

recursive_mutex
(C++11)
предоставляет механизм взаимного исключения, который может быть заблокирован рекурсивно тем же потоком
(класс)
lock_guard
(C++11)
реализует оболочку владения мьютексом, основанную на строгом объеме
(шаблон класса)
unique_lock
(C++11)
реализует переместимый обёртку владения мьютексом
(шаблон класса)
scoped_lock
(C++17)
оболочка RAII для предотвращения тупиков при работе с несколькими мьютексами
(шаблон класса)
condition_variable
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API