C++ memory order 可见性概念

  • Post author:
  • Post category:其他




背景

所有的memory的顺序文章中都有可见性,可是啥是可见性好像没有人专门解释,可是不理解这个名词完全看不懂啥意思,为此特地记录一下这个概念,也不太清楚理解的是否对,希望有大佬帮忙指正。



示例

下面是两段代码,目的很简单就是线程0负责去初始化对象object, 线程1根据flag的结果去让object正常run起来。但是由于编译和cpu的原因,会导致线程0的两行代码在执行时候顺序反了,也就是flag置为true, 但是init()还没开始,这个听起来就很扯,但是由于两行代码没有任何依赖,在编译器或者cpu执行时候会有这种效果,对于线程0而言没有任何问题,但是线程1就会崩溃了。

// thread_0
object.init();
flag_is_init = true;
// thread_1
if(flag_is_init)
{
	object.run();
}

目前市面上有一些解决方案, 下面是伪代码, memory_order_release保证在此之前的读写操作不能重排到该操作之后,memory_order_acquire保证在此之后的读写操作不能重排到该操作之前,这里会说对于变量flag_is_init而言,thread_0中的object.init()操作对object.run()是

可见

的。

// thread_0
object.init();
memory_order_release(flag_is_init = true);
// thread_1
if(memory_order_acquire(flag_is_init))
{
	object.run();
}



通俗理解

这里可见性,是基于上面两个memory_order来解释理解:

根据上面示例可以猜测,所谓的

可见

就是,一旦线程1遇到走到memory_order_acquire(flag_is_init)时候,假如flag_is_init是true,那么可以保证线程0在memory_order_release(flag_is_init = true)之前的代码100%是执行了。假如flag_is_init 还不是true的话,那么thread1也就可以确定thead0至少还没执行到memory_order_release这一行代码,init()可能执行了也可能没有执行。

所以

可见性

我觉得就是在线程1中假如某个变量到达预期结果,那么可以保证其他某个线程实现该预期效果操作之前的操作一定是完成的。



版权声明:本文为feng__shuai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。