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 提供独占的、非递归的所有权语义:

  • 调用线程从成功调用 lock try_lock 开始,直到调用 unlock 期间,均 持有 mutex
  • 当某线程持有一个 mutex 时,其他所有线程若试图获取该 mutex 的所有权,将会被阻塞(针对 lock 的调用)或收到 false 返回值(针对 try_lock )。
  • 调用线程在调用 lock try_lock 前不得已持有该 mutex

mutex 在被任何线程持有时被销毁,或线程在持有 mutex 时终止,则程序行为未定义。 mutex 类满足 Mutex StandardLayoutType 的所有要求。

std::mutex 既不可复制也不可移动。

目录

嵌套类型

名称 定义
native_handle_type ( 可选* ) 由实现定义

成员函数

构造互斥锁
(公开成员函数)
销毁互斥锁
(公开成员函数)
operator=
[deleted]
不可复制赋值
(公开成员函数)
加锁操作
锁定互斥锁,若互斥锁不可用则阻塞
(公开成员函数)
尝试锁定互斥锁,若互斥锁不可用则立即返回
(公开成员函数)
解锁互斥锁
(公开成员函数)
原生句柄
返回底层实现定义的原生句柄对象
(公开成员函数)

注释

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)
{
    // 模拟一个耗时的页面获取过程
    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();
    // 现在可以安全地访问 g_pages,因为线程已执行完毕
    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 关联的条件变量
(类)