C++17提供了两种新的互斥:
lock_guard<std::shared_mutex> 、lock_guard<std::shared_time_mutex>它们与mutex一样都保证了访问的排他性.
共享锁仅有一个限制:假设它已经被某些线程持有,若别的线程视图获取排他锁,就会发生阻塞,直到那些线程全部释放该共享锁。
下面是个demo:
class dns_entry;
class dns_cache {
std::map<std::string, dns_entry> entries;
mutable std::shared_mutex entry_mtx;
public:
dns_entry find_entry(std::string const& domain) const
{
std::shared_lock<std::shared_mutex> lk(entry_mtx);
auto iter = entries.find(domain);
return (iter == entries.end()) ? dns_entry() : iter->second;
}
void update_or_add_entry(std::string const& domain, dns_entry const& dns_details) {
std::lock_guard<std::shared_mutex> lk(entry_mtx);
entries[domain] = dns_details;
}
};
当缓存表需要更新时,update_or_add_entry()采用std::lock_guard<>实例进行排他访问。
No comments yet.