std::mutex
来自 cppreference.com
在头文件 <mutex> 中定义 |
||
class mutex; |
(自 C++11 起) | |
mutex
类是一种同步原语,可用于保护共享数据免受多个线程同时访问。
mutex
提供独占的、非递归的所有权语义
- 调用线程从它成功调用
lock
或try_lock
开始拥有mutex
,直到它调用unlock
为止。 - 当一个线程拥有
mutex
时,所有其他线程都会阻塞(对于对lock
的调用)或收到 false 返回值(对于try_lock
),如果它们尝试获取mutex
的所有权。 - 调用线程在调用
lock
或try_lock
之前不能拥有mutex
。
如果 mutex
在被任何线程拥有时被销毁,或者线程在拥有 mutex
时终止,则程序的行为是未定义的。mutex
类满足 Mutex 和 StandardLayoutType 的所有要求。
std::mutex
既不可复制也不可移动。
内容 |
[编辑] 嵌套类型
名称 | 定义 |
native_handle_type (可选*) |
实现定义的 |
[编辑] 成员函数
构造互斥量 (公有成员函数) | |
销毁互斥量 (公有成员函数) | |
operator= [已删除] |
不可复制赋值 (公有成员函数) |
锁定 | |
锁定互斥量,如果互斥量不可用则阻塞 (公有成员函数) | |
尝试锁定互斥量,如果互斥量不可用则返回 (公有成员函数) | |
解锁互斥量 (公有成员函数) | |
本机句柄 | |
返回底层的实现定义的本机句柄对象 (公有成员函数) |
[编辑] 说明
通常不直接访问 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 关联的条件变量。 (类) |