首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定使用栅栏(栅栏)的地点

确定使用栅栏(栅栏)的地点
EN

Stack Overflow用户
提问于 2013-12-07 21:36:51
回答 1查看 218关注 0票数 3

x86指令lfence/sfence/mfence用于在Linux内核中实现人民币()、/wmb()、/mb()机制。很容易理解,它们用于序列化内存访问。然而,在编写代码时很难确定何时何地使用这些代码--在运行时行为中遇到bug之前。

我很想知道,在编写/检查代码时,是否可以检查已知的注意事项,以帮助我们确定必须插入哪些障碍。我知道这太复杂了,但是是否有经验法则或清单可以帮助我们识别需要这些代码的地方呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-09 17:02:49

我的经验(不是在Linux内核中)是,两种模式涵盖了对围栏的绝大部分需求。

模式"Send/receive":线程1将数据发送到线程2,并且有一个内存位置以某种方式表示“数据已经准备好”。线程1至少需要在存储数据和存储到“数据准备就绪”之间设置围栏。线程2需要在表示“数据已经准备好”的数据负载和数据负载之间设置一个隔离。

如果只是正常的(非时态的,DMA设备等)在传输过程中需要加载/存储,然后只需要编译器围栏。此外,锁前缀指令意味着栅栏。例如,有时“数据准备就绪”的位置不仅仅是一个标志,而是一个原子计数器,用于操作它的锁前缀增量/递减可以用作栅栏。

此模式还包括自旋锁。释放锁是“发送”。获取锁就是“接收”。

模式" consensus ":两个线程必须就某件事情达成共识。必须有mfence (或锁前缀指令所暗示的)。围栏必须介于“我公布了我的投票”和“我看了另一条线的投票”之间。德克尔协议就是一个例子。最困难的部分是发现这个模式。我们曾经错过了TBB内部的一个深层次,其中的共识问题是“抛出了一个例外吗?”最后,我们意识到这是一个协商一致的问题,因此需要一个围栏。

以上两种模式是经验法则,并不涵盖所有案例,但我发现它们涵盖了99%的案例。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20446982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档