Atomicity of the simple assignment operator

这一生的挚爱 提交于 2019-12-01 02:15:56

问题


C11 Standard says that for atomic types (_Atomic), prefix and postfix ++ and -- operations are atomic (6.5.2.4.,p2), as are compound assignments: op= (6.5.16.2,p3).

I haven't found anything written about a simple assignment =. Is it also atomic?

Let's says E1, E2 are int, but only E1 is defined with the specifier _Atomic. My assumption is that this:

E1 = E2;

is equivalent to:

atomic_store( &E1 , E2 );

It my assumption correct?


回答1:


Following the example in this Dr Dobbs article, simple assignment of atomic variables in C11 is atomic.

The C11 standard (ISO/IEC 9899:2011), section 6.2.6.1/9 reads:

Loads and stores of objects with atomic types are done with memory_order_seq_cst semantics.

In addition to being atomic, operations performed with memory_order_seq_cst semantics have a single ordering observed by all threads (aka sequentially-consistent ordering).

Without the _Atomic type qualifier, it is possible for an assignment to be non-atomic. Assigning a 64 bit value (e.g. a long long) on a 32 bit machine requires two CPU cycles. If another thread reads the value between those two cycles they'll get 4 bytes of the old value and 4 bytes of the new value.



来源:https://stackoverflow.com/questions/34885006/atomicity-of-the-simple-assignment-operator

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