No, this is not portable in general. calloc
only guarantees a byte-wise 0
value of the underlying object. For types that (may) have a state this is not equivalent to an initialization. You definitively have to use atomic_init
to put your object into a valid state.
The reason for this are platforms that hold a "lock" in addition to the base object because they don't implement the corresponding assembler instruction. So to be portable you really need to use ATOMIC_VAR_INIT
or atomic_init
for all atomic objects that are not statically allocated.
That said, I don't know of any existing platform that would need such cruft for atomic_int
. If your platform has ATOMIC_INT_LOCK_FREE
set to 2
and sizeof(atomic_int)==sizeof(int)
, you can be relatively sure that your strategy works. You could test that in a _Static_assert
.