std:: mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
Определено в заголовке
<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)
|
предоставляет механизм взаимного исключения, который может быть рекурсивно заблокирован тем же потоком
(класс) |
|
(C++11)
|
реализует строго ограниченную областью видимости обёртку владения мьютексом
(шаблон класса) |
|
(C++11)
|
реализует перемещаемую обёртку владения мьютексом
(шаблон класса) |
|
(C++17)
|
избегающая взаимных блокировок RAII-обёртка для нескольких мьютексов
(шаблон класса) |
|
(C++11)
|
предоставляет переменную условия, ассоциированную с
std::unique_lock
(класс) |