C++11 atomics: does it make sense, or is it even possible, to use them with memory mapped I/O?

坚强是说给别人听的谎言 提交于 2021-02-08 23:32:51

问题


As I understand it, C volatile and optionally inline asm for memory fence have been used for implementing a device driver on top of memory mapped I/O. Several examples can be found in Linux kernel.

If we forget about the risk of uncaught exceptions (if any,) does it make sense to replace them with C++11 atomics? Or, is it possible at all?


回答1:


In general, you can replace memory fences with atomics, but not volatile, except where it is used together with a fence exclusively for inter thread communication.

Whith regard to memory mapped I/O the reason atomics don't suffice is that:

  • volatile guarantees you that all memory accesses to that variable in your program do actuall happen and that they happen (whithin a single thread) exactly in the order you specify.
  • std::atomic only guarantees that your program will behave as if all those memory accesses happen (according to C++'s memory model, which doesn't know about memory mapped I/O) and - depending on the specified memory ordering - as if they happen in the specified order.

In practical terms that means, that the compiler can e.g. replace consecutive writes to the same (non-volatile) atomic with a single write (if there is no other synchronization in between) and the same is true for reads. If the result of the read is not used, it could even eliminate the read completely (the compiler might still have to issue a memory barrier though).

On a more theoretical level, if your compiler can prove that all your program does is returning 42, then it is allowed to transform this into a single instruction independently of how many threads and atomics your program uses in the process. If your program uses volatile variables that is not the case.

EDIT: E.g. This paper shows a few posssible (and probably unexpected) optimizations the compiler is allowed to apply to an atomic loop variable.




回答2:


As I understand for reading references std::atomic is designed to manage multi-threading access to memory (concurrency, and so on). But as I know, as well as you said, volatile is designed for things like memory mapped I/O and signal handling. So, volatile has no effect on atomic access and not resolve multi-threading access issues like atomics if used alone. And vice versa - atomics do not provide features of volatile.

Thus, the short answer to your question is NO.



来源:https://stackoverflow.com/questions/35594009/c11-atomics-does-it-make-sense-or-is-it-even-possible-to-use-them-with-memo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!