首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效的内存屏障

有效的内存屏障
EN

Stack Overflow用户
提问于 2011-09-08 17:52:08
回答 6查看 1.9K关注 0票数 4

我有一个多线程应用程序,其中每个线程都有一个整数类型的变量。这些变量在程序执行期间递增。在代码中的某些点,线程将其计数变量与其他线程的计数变量进行比较。

现在,我们知道在多核上运行的线程可能会乱序执行,因此一个线程可能不会读取其他线程的预期计数器值。要解决这个问题,一种方法是使用原子变量,如C++11的std::atomic<>。然而,在计数器每增加一次时执行内存围栏将显著减慢程序速度。

现在我要做的是,当一个线程将要读取其他线程的计数器时,才会创建一个内存栅栏,并且所有线程的计数器都会在此时更新内存中的计数器。如何在C++中做到这一点。我使用Linux和g++。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-08 18:08:01

C++11标准库包括对带有std::atomic_thread_fence<atomic>中的栅栏的支持。

调用此函数将调用一个完整的栅栏:

代码语言:javascript
复制
std::atomic_thread_fence(std::memory_order_seq_cst);

如果您只想发出一个acquire或者只想发出一个release栅栏,那么您可以使用std:memory_order_acquirestd::memory_order_release

票数 4
EN

Stack Overflow用户

发布于 2011-09-08 18:00:04

有一些x86内部函数对应于您可以自己使用的内存屏障。Windows头文件有一个内存屏障宏,因此您应该能够找到与Linux等效的宏。

票数 1
EN

Stack Overflow用户

发布于 2011-09-08 17:56:58

您可以使用boost::asio::strand来实现此目的。创建一个负责读取计数器的处理程序。该处理程序可以从多个线程调用。不是直接调用处理程序,而是将其包装在一个boost::asio::strand中。这将确保处理程序不会被多个线程并发调用。

http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/tutorial/tuttimer5.html

我希望我正确理解了这个问题。

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

https://stackoverflow.com/questions/7346163

复制
相关文章

相似问题

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