如果某个想法是你唯一的想法,再也没有比这个更危险的事情了。
本节会阐述保护共享数据的替代方案,很多情况下,使用互斥量并不合适,会带来性能消耗。下文会详细讲解集中通用的场景。
保护共享数据的初始化过程
为了防止共享数据初始化时数据被破坏,C++提供了std::once_flag和std::call_once来保证共享数据初始化的正确性。
// using mutex
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();
}
// using call_once
std::shared_ptr<some_resource> resource_ptr;
std::once_flag resource_flag;
void int_resource()
{
resource_ptr.reset(new some_resource);
}
void foo()
{
std::call_once(resource_flag, init_resource);
resource_ptr->do_something();
}
保护很少更新的数据量
对于这种共享数据可以采用“读者-写着锁”,其允许两种不同的使用方式:一个作者线程独占访问和共享访问,让多个读者线程并发访问。
C++标准并没有提供相关的解决方案,我们可以使用boost::sh

本文探讨了在C++中保护共享数据的策略,包括使用std::once_flag和std::call_once保证初始化正确性,利用读者-写者锁(如boost::shared_mutex)优化对少量更新数据的访问,以及处理嵌套锁的正确方法,避免未定义行为。这些方法旨在提升并发性能并确保数据一致性。
最低0.47元/天 解锁文章
725

被折叠的 条评论
为什么被折叠?



