Let's look at the atomics API for the languages C11, C++1x, D, and Java. This is a kind of "Rosetta Stone" of the different languages, which should come in handy for those of you wishing to translate a piece of concurrent code from one language to another.
Due to lack of space, we start by comparing the basic API for C11, C++1x and D:
Two things to notice on this board is that D has more "boiler plate" code than C11 or C++1x, and that there is no atomic addition in D (am I missing something?), so it has to be implemented using a CAS loop.
As is to be expected, there are a lot of similarities between these three languages, but when we get to Java it starts to get a bit more complicated.
First, there is no single API for atomics, but kind of three APIs:
The first thing that pops out is that using relaxed atomics with the Atomic* classes or volatile is currently not possible without resorting to sun.misc.Unsafe
Another detail for Java is that I'm not sure what the memory model defines in terms of race conditions for "relaxed atomics" (because it doesn't even mention such a thing), while on C++1x, C11 and D it is well defined, and this is important as we will see in a few posts.
I'm not an expert in all of these languages, so if you see anything missing or wrong, please let me know in the comments section.
If you need more info you can probably find it on one of these links:
http://en.cppreference.com/w/cpp/atomic
http://en.cppreference.com/w/c/atomic
http://dlang.org/phobos/core_atomic.html
http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html
http://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html
http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/classes/sun/misc/Unsafe.java
This comment has been removed by a blog administrator.
ReplyDelete