std:: mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
定义于头文件
<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)
|
提供可由同一线程递归锁定的互斥设施
(类) |
|
(C++11)
|
实现严格基于作用域的互斥所有权包装器
(类模板) |
|
(C++11)
|
实现可移动的互斥所有权包装器
(类模板) |
|
(C++17)
|
避免死锁的多互斥体RAII包装器
(类模板) |
|
(C++11)
|
提供与
std::unique_lock
关联的条件变量
(类) |