std::mutex
Материал из cppreference.com
| Defined in header <mutex>
|
||
| class mutex; |
(начиная с C++11) | |
Класс mutex является примитивом синхронизации, который может использоваться для защиты разделяемых данных от одновременного доступа нескольких потоков.
mutex предлагает эксклюзивую, нерекурсивную семантику владения:
- Вызывающий поток владеет мьютексом со времени успешного вызова
lockилиtry_lock, и до момента вызоваunlock. - Пока поток владеет мьютексом, все остальные потоки при попытке завладения им блокируются на вызове
lockили получают значение false при вызовеtry_lock. - Вызывающий поток не должен владеть мьютексом до вызова
lockилиtry_lock.
Поведение программы не определено, если занятый некоторым потоком мьютекс разрушается. Класс mutex является некопируемым.
Содержание |
[править] Типы
| Тип | Определение |
native_handle_type
|
определяется реализацией |
[править] Функции-члены
| создаёт мьютекс Оригинал: constructs the mutex Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
Блокировка | |
| блокирует мьютекс, выполнение останавливается если мьютекс недоступен (public функция-член) | |
| пытается заблокировать мьютекс, возвращается, если мьютекс недоступен (public функция-член) | |
| разблокирует мьютекс (public функция-член) | |
Дескриптор | |
| возвращает определяемый реализацией дескриптор потока (public функция-член) | |
[править] Пример
Этот пример показывает, как mutex может использоваться для защиты std::map, разделяемого между двумя потоками.
Запустить этот код
#include <iostream> #include <chrono> #include <thread> #include <mutex> #include <map> #include <string> 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 = "фальшивое содержимое"; g_pages_mutex.lock(); g_pages[url] = result; g_pages_mutex.unlock(); } int main() { std::thread t1(save_page, "http://foo"); std::thread t2(save_page, "http://bar"); t1.join(); t2.join(); g_pages_mutex.lock(); //Избыточный код, так как потоки завершили выполнение for (const auto &pair : g_pages) { std::cout << pair.first << " => " << pair.second << '\n'; } g_pages_mutex.unlock(); //Избыточный код, так как потоки завершили выполнение }
Вывод:
http://bar => фальшивое содержимое http://foo => фальшивое содержимое

