DragonOS中实现了与Linux相似的READ_ONCE()宏以及WRITE_ONCE()宏,主要目的在于解决并行计算场景下,编译器错误的优化导致的数据访问错误的问题。下面进行简单的介绍:
这两个宏主要是为了解决并行访问的问题的。编译器在优化代码的时候,会对一些操作进行重排序,或者删掉一些它认为无用的操作。这些优化在单线程的环境下不存在问题,但是对于操作系统而言,时刻都存在着并行的计算,这样的乱序处理很可能会造成问题。为了保证代码之间不乱序,我们可以使用READ_ONCE()和WRITE_ONCE()宏,告知编译器涉及到的操作之间不能乱序。
主要使用场景
- 两个进程或者中断处理函数之间的信息交流与沟通
- 确保编译器不会折叠、旋转或以其他方式对代码进行优化,从而破坏数据访问顺序。
他们之间的区别
细心的小伙伴会发现:对于读取一个变量的值,好像这两个宏都能实现哦!对于这个问题,我们需要回到最开始的出发点:我们到底是要保护哪个操作不被乱序?
阅读这两个宏的源代码之后我们不难发现:
// READ_ONCE能保证变量x的读取操作不被乱序,但不能确保对a[0]、a[1]的写入操作不乱序
a[0] = READ_ONCE(x);
a[1] = READ_ONCE(x);
// WRITE_ONCE能保证对a[0]、a[1]的写入操作不乱序,但不能确保对x的读操作不乱序。
WRITE_ONCE(a[0], x);
WRITE_ONCE(a[1], x);
以上就是对READ_ONCE()和WRITE_ONCE()的简单介绍,如果有任何疑问或意见,可以通过邮件联系我:longjin@RinGoTek.cn
转载请注明来源:https://longjin666.cn/?p=1560
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~