unique_lock
- 因为unique_lock类也具有成员函数lock,unlock,trylock,它含有一个内部标志,表明关联的互斥是否正在被使用,此标志可以通过调用成员函数owns_lock()查询。
1 在初始化过程中保护共享数据
- 延迟初始化 ( lazy initialization )
- std::once_flag 类和 std::call_once( ) 函数
- 注意智能指针的 reset 方法。
std::shared_ptr<some_resource> resource_ptr;
std::mutex resource_mutex;
void foo()
{std::unique_lock<std::mutex> lk(resource_mutex);if(!resource_ptr){resource_ptr.reset(new some_resource);}lk.unlock();resource_ptr->do_something();
}
2 保护很少更新的数据 ( 读多写少 )
- 也可以被称为读写互斥,C++17提供了两种新的互斥方法,share_mutex, share_timed_mutex,
- 使用shared_lock<shared_mutex>实现共享访问
#include <map>
#include <string>
#include <mutex>
#include <shared_mutex>
class dns_entry
{};
class dns_cache
{std::map<std::string,dns_entry> entries;std::shared_mutex entry_mutex;
public:dns_entry find_entry(std::string const& domain){std::shared_lock<std::shared_mutex> lk(entry_mutex);std::map<std::string,dns_entry>::const_iterator const it=entries.find(domain);return (it==entries.end())?dns_entry():it->second;}void update_or_add_entry(std::string const& domain,dns_entry const& dns_details){std::lock_guard<std::shared_mutex> lk(entry_mutex);entries[domain]=dns_details;}
};