c – 内存障碍:工作线程如何确保初始化写入?

c – 内存障碍:工作线程如何确保初始化写入?,第1张

概述我对使用内存屏障/栅栏进行编程是相当新的,我想知道如何保证设置写入在随后在其他CPU上运行的工作器函数中可见.例如,请考虑以下事项: int setup, sheep;void SetupSheep(): // Run once CPU 1: setup = 0; ... much later CPU 1: sheep = 9; CPU 1: std::a 我对使用内存屏障/栅栏进行编程是相当新的,我想知道如何保证设置写入在随后在其他cpu上运行的工作器函数中可见.例如,请考虑以下事项:

int setup,sheep;voID SetupSheep():    // Run once    cpu 1: setup = 0;    ... much later    cpu 1: sheep = 9;    cpu 1: std::atomic_thread_fence(std::memory_order_release);    cpu 1: setup = 1;

之后(不是同时)运行很多次:

voID ManipulateSheep():    cpu 2: int mySetup = setup;    cpu 2: std::atomic_thread_fence(std::memory_order_acquire);    cpu 2: // Use sheep...

在cpu 2上,如果mySetup是1,那么羊肯定是9 – 但是我们怎样才能保证mySetup不为0?

到目前为止,我所能想到的是在cpu 2上旋转等待直到设置为1.但是这看起来非常难看,因为旋转等待只需要在第一次调用ManipulateSheep()时等待.当然必须有更好的方法吗?

请注意,未初始化代码也存在对称问题:假设您正在编写一个无锁数据结构,该结构在其生命周期内分配内存.在析构函数中(假设所有线程都已完成调用方法),您希望释放所有内存,这意味着您需要运行析构函数的cpu具有最新的变量值.在这种情况下甚至不可能旋转等待,因为析构函数无法知道“最新”状态是什么,以便检查它.

编辑:我想我要问的是:有没有办法说“等待所有商店传播到其他cpu”(用于初始化)和“等待所有商店传播到我的cpu”(用于未初始化)?

解决方法 事实证明,#StoreLoad正是这种情况的正确障碍. As explained simply by Jeff Preshing:

A StoreLoad barrIEr ensures that all stores performed before the barrIEr are visible to other processors,and that all loads performed after the barrIEr receive the latest value that is visible at the time of the barrIEr.

在C 11中,std :: atomic_thread_fence(std :: memory_order_seq_cst)显然充当#StoreLoad屏障(以及其他三个:#StoreStore,#LoadLoad和#LoadStore).见this C++11 draft paper.

附注:在x86上,mfence instruction充当#StoreLoad;如果需要,通常可以使用_mm_fence()编译器内部函数发出.

因此,无锁代码的模式可能是:

Initialize:    cpu 1: setupStuff();    cpu 1: std::atomic_thread_fence(std::memory_order_seq_cst);Run parallel stuffUninitialize:    cpu 2: std::atomic_thread_fence(std::memory_order_seq_cst);    cpu 2: teardownStuff();
总结

以上是内存溢出为你收集整理的c – 内存障碍:工作线程如何确保初始化写入?全部内容,希望文章能够帮你解决c – 内存障碍:工作线程如何确保初始化写入?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存