views:

210

answers:

1

Exposition:

I am on Linux / Mac.

Part of my code is in Java, part of my code is in C++.

They both have the same file mmapped for fast communication.

I want to synchronize the Java & C++ code.

I know the following:

1) given two threads in Java, I can use Locks / monitors.

2) given one piece of code in Java, one in C++, I can have them synchronize over tcp/ip

3) given two pieces of C++ code, that have mmaped an area of memory, I can have them synchronize using gcc's compare_and_swap on a integer in the mmaped region.

Question:

Given that part of my code is in Java, part of my code is in C++, can I somehow do (3) -- does the JVM support some type of atomic compare & swap ? So both my Java & C++ code can use this integer as a lock of sorts?

Thanks!

+1  A: 

You could write a small C/C++ library that only purpose is to sync with your C++ code (using conventional IPC sync objects). Then you could would this library from your java process using JNI.

yonilevy
This solution is so simple; yet I never thought of it. However, this seems awfully expensive (a JNI call) to do just this. Is there no cheaper way?
anon
why expensive? How would CAS be implemented any differently if it was built into the API? Java has CAS through cmpxchg on intel, but I don't think you can specify the mem location to something else but a java variable.
disown
JVMs (and CLRs) do JITing, so you have straight assembly language calls from JITted Java via JNI to C all the way without any OS calls slowing you down. I'd suggest trying it and actually measure the overhead you incur instead of guessing.
Carsten Kuckuk