我有一个multithreading应用程序,其中每个线程都有一个整数types的variables。 这些variables在程序执行期间递增。 在代码中的某些点,一个线程将其计数variables与其他线程的计数variables进行比较。
现在,我们知道在多核上运行的线程可能会乱序执行,线程可能不会读取其他线程的预期计数器值。 为了解决这个问题,一种方法是使用primefacesvariables,比如C ++ 11的std :: atomic <>。 但是,在每个计数器增量处执行一次内存隔离将显着减慢程序。
现在我想要做的是,当一个线程正在读取其他线程的计数器时,只有一个内存围栏被创build,并且所有线程的计数器在内存中被更新。 这怎么可以在C ++中完成。 我正在使用Linux和g ++。
C ++ 11标准库在<atomic>
包含对std::atomic_thread_fence
。
调用这个调用一个完整的篱笆:
std::atomic_thread_fence(std::memory_order_seq_cst);
如果你只想发射一个获取或者只发布一个fence,你可以使用std:memory_order_acquire
和std::memory_order_release
来代替。
有与您可以使用自己的内存障碍相对应的x86内在函数。 Windows标题有一个内存屏障宏,所以你应该能够找到一些相当于Linux的东西。
你可以使用boost :: asio :: strand来达到这个目的。 创建一个负责读取计数器的处理程序。 该处理程序可以从多个线程中调用。 不要直接调用处理程序,而是将其包装在boost :: asio :: strand中。 这将确保处理程序不能同时被多个线程调用。
http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/tutorial/tuttimer5.html
我希望我能理解这个问题。
我的建议是在一个更高级别的类中有一个collectTimers()函数,可以要求每个线程的计数器(通过queue / msg)。 这样更新定时器不会延迟,但是收集定时器要慢一点。
这只有在线程之间有某种通信机制的情况下才有效。
为什么不有一个“控制”线程,每个线程向谁报告其计数器增量并询问其他值?
这将使它非常有效和简单。 只是一个建议。
你可以尝试像http://mirror.nexcess.net/kernel.org/linux/kernel/people/paulmck/perfbook/perfbook.2011.08.28a.pdf Secion 4.4.3中的信号盗窃限制计数器设计
这种设计可以消除fastpath中的原子操作(递增每个线程计数器)。 当然,复杂程度是否值得由您决定。