03 线程间共享数据

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实现共享访问
#include 
#include 
#include 
#include 
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;
    }
};

你可能感兴趣的:(C++并发编程,c++)