Atomicity of operations is caused by hardware, not software (well, in C++ there are also "atomic" variables that are atomic in name only, those are implemented via mutexes and locks). So, basically, C++ atomics and C atomics do the very same thing. Hence as long as the types are compatible there won't be issues. And C++11 and C11 atomic classes were made to be compatible.
Apparently, people do not understand how atomics and locks work and require further explanation. Check out current memory models for more information.
1) We will start with basics. What and why are atomics? How does memory works?
Memory Model: think of processor as several independent cores and each has its own memory (cashes L1, L2, and L3; and in fact, L3 cash is common but it isn't really important).
Why do we need atomic operation?
If you don't use atomics, then each processor might have its own version of the variable 'x' and they are in general not synchronized. There is no telling when they will perform synchronizations with RAM/L3 cash.
When atomic operations are used, such memory operations are used that ensure synchronization with RAM/L3 cash (or whatever is needed) - ensuring that different cores have access to the same variable and not have variety of different versions of it.
Nobody cares if it is C, C++, or whatever language you use - as long as one ensures memory synchronization (both read, write, and modify) there will never be no issues.
2) OK, what about locks and mutexes?
Mutexes tend to work with OS and have queue over which thread should be allowed next to perform. And they enforce stricter memory synchronization than atomics do. With atomics one can syhchronize just the variable itself or more depending on the request / which function you call.
3) Say I have atomic_bool, can it work in interchangeably on different languages (C/C++11)?
Normally a boolean can be sychronized via memory operations (you're just synchronizing a single byte of memory from their perspective).
If the compilers are aware that the hardware can perform such operations then they surely will use them as long as you use the standard.
Logical atomics (any std::atomic< T > with T having wrong size/alignment) are synchronized via locks. In this case it is unlikely that different languages can use them interchangeably - if they have different methods of usage of these locks, or for some reason one decided to use a lock and the other one came to conclusion that it can work with atomic hardware memory synchronizations... then there will be issues.
If you use atomic_bool on any modern machine with C/C++, it will surely be able to synchronize without locks.