std::mutex
性病::互斥
Defined in header | | |
---|---|---|
class mutex; | | (since C++11) |
大mutex
类是一个同步原语,可用于保护共享数据不被多个线程同时访问。
mutex
提供独占的、非递归的所有权语义:
- 调用线程
拥有
阿mutex
从它成功调用lock
或try_lock
直到它召唤unlock
...
- 当线程拥有
mutex
的调用,所有其他线程都将阻塞%28lock
%29或收到false
返回值%28try_lock
%29如果他们试图声称对mutex
...
- 调用线程不能拥有
mutex
打电话前lock
或try_lock
...
如果mutex
在任何线程仍然拥有时被销毁,或者线程在拥有mutex
...mutex
类满足Mutex
和StandardLayoutType
...
std::mutex
既不可复制也不可移动。
成员类型
Member type | Definition |
---|---|
native_handle_type(optional) | implementation-defined |
成员函数
(constructor) | constructs the mutex (public member function) |
---|---|
(destructor) | destroys the mutex (public member function) |
operator= deleted | not copy-assignable (public member function) |
锁紧
锁锁互斥锁,如果互斥锁不可用,则阻塞%28公共成员函数%29。
试一试[医]锁试图锁定互斥锁,如果互斥锁不可用,则返回%28公共成员函数%29。
解锁解锁互斥锁%28公共成员函数%29
本机手柄
土生土长[医]句柄返回底层实现定义的线程句柄%28公共成员函数%29
注记
std::mutex
通常不能直接访问:std::unique_lock
,,,std::lock_guard
,或std::scoped_lock
%28因为C++17%29以一种更异常安全的方式管理锁定。
例
此示例演示如何mutex
可以用来保护std::map
在两个线程之间共享。
二次
#include <iostream>
#include <map>
#include <string>
#include <chrono>
#include <thread>
#include <mutex>
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 &pair : g_pages) {
std::cout << pair.first << " => " << pair.second << '\n';
}
}
二次
产出:
二次
http://bar => fake content
http://foo => fake content
二次
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。