std::mutex
来自 cppreference.cn
定义于头文件 <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
类满足 Mutex 和 StandardLayoutType 的所有要求。
std::mutex
既不可复制也不可移动。
目录 |
[编辑] 嵌套类型
名称 | 定义 |
native_handle_type (可选*) |
实现定义 |
[编辑] 成员函数
构造互斥体 (public 成员函数) | |
销毁互斥体 (public 成员函数) | |
operator= [已删除] |
不可复制赋值 (public 成员函数) |
加锁 | |
锁定互斥体,如果互斥体不可用则阻塞 (public 成员函数) | |
尝试锁定互斥体,如果互斥体不可用则返回 (public 成员函数) | |
解锁互斥体 (public 成员函数) | |
原生句柄 | |
返回底层实现定义的原生句柄对象 (public 成员函数) |
[编辑] 注意
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 关联的条件变量 (类) |