我有一个多线程应用程序,其中每个线程都有一个整数类型的变量。这些变量在程序执行期间递增。在代码中的某些点,线程将其计数变量与其他线程的计数变量进行比较。
现在,我们知道在多核上运行的线程可能会乱序执行,因此一个线程可能不会读取其他线程的预期计数器值。要解决这个问题,一种方法是使用原子变量,如C++11的std::atomic<>。然而,在计数器每增加一次时执行内存围栏将显著减慢程序速度。
现在我要做的是,当一个线程将要读取其他线程的计数器时,才会创建一个内存栅栏,并且所有线程的计数器都会在此时更新内存中的计数器。如何在C++中做到这一点。我使用Linux和g++。
发布于 2011-09-08 18:08:01
C++11标准库包括对带有std::atomic_thread_fence的<atomic>中的栅栏的支持。
调用此函数将调用一个完整的栅栏:
std::atomic_thread_fence(std::memory_order_seq_cst);如果您只想发出一个acquire或者只想发出一个release栅栏,那么您可以使用std:memory_order_acquire和std::memory_order_release。
发布于 2011-09-08 18:00:04
有一些x86内部函数对应于您可以自己使用的内存屏障。Windows头文件有一个内存屏障宏,因此您应该能够找到与Linux等效的宏。
发布于 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
我希望我正确理解了这个问题。
https://stackoverflow.com/questions/7346163
复制相似问题