2010-01-10 4 views
2

Exposition:Java, C++, NIO, tampon mmaped, synchronisation

Je suis sous Linux/Mac.

Une partie de mon code est en Java, une partie de mon code est en C++.

Ils ont tous deux le même fichier mmapped pour une communication rapide.

Je souhaite synchroniser le code C++ Java &.

Je sais ce qui suit:

1) donné deux fils en Java, je peux utiliser des verrous/moniteurs.

2) étant donné un morceau de code en langage Java, une en C++, je peux avoir les synchroniser sur TCP/IP

3) donné deux morceaux de code C++, qui ont mmaped une zone de mémoire, je peux faites-les synchroniser en utilisant compare_and_swap de gcc sur un entier dans la région mmaped.

Question:

Étant donné qu'une partie de mon code est en Java, une partie de mon code est en C++, puis-je faire en quelque sorte (3) - ce que le support JVM un certain type de atomique comparer & échange? Donc, mes deux Java & code C++ peuvent utiliser cet entier comme un verrou de toutes sortes?

Merci!

+1

http://www.google.com/search?q=atomic+java – Potatoswatter

Répondre

2

Vous pouvez écrire une petite bibliothèque C/C++ dont le seul but est de synchroniser avec votre code C++ (en utilisant des objets de synchronisation IPC classiques). Alors vous pourriez faire cette bibliothèque à partir de votre processus Java en utilisant JNI.

+0

Cette solution est si simple; pourtant je n'y ai jamais pensé. Cependant, cela semble terriblement cher (un appel JNI) pour faire exactement cela. N'y a-t-il pas de moyen moins cher? – anon

+0

pourquoi cher? Comment CAS serait implémenté différemment s'il était intégré dans l'API? Java a CAS via cmpxchg sur intel, mais je ne pense pas que vous pouvez spécifier l'emplacement mem à autre chose, mais une variable java. –

+0

JVM (et CLR) font JITing, de sorte que vous avez des appels en langage assemblé directement de JITted Java via JNI à C tout le chemin sans aucun appel de l'OS vous ralentir. Je suggère de l'essayer et de mesurer réellement les frais généraux que vous encourez au lieu de deviner. –