2009-12-14 3 views
0

J'ai un code objectif-c qui utilise un NSLock pour implémenter un type de transaction. L'objet est verrouillé sur une "transaction de début", plusieurs autres appels sont effectués avec le verrou en place, puis il est libéré avec un "commit". J'écris une couche de colle JNI pour accéder à ce code à partir de Java, mais le verrou se comporte différemment dans JNI par rapport au code objc pur.Mutex dans JNI utilisant Foundation NSLock

J'ai des tests unitaires dans Java et objc qui exercent le code qui rend le verrou. Le test objc réussit, mais dans le test Java [anNSLock tryLock] renvoie false même si [un verrou anNSLock] n'a pas été appelé.

Existe-t-il une manière recommandée d'avoir un mutex dans JNI? Je ne suis pas sûr du mécanisme sous-jacent de NSLock.

Merci!

Répondre

1

Les documents pour NSLock indiquent que NSLock utilise des threads Posix. Java utilise-t-il des threads Posix? Un couple d'alternative: Le premier est de créer un wrapper synchronisé en Java pour votre objet. La seconde consiste à utiliser les méthodes JNI MonitorEnter et MonitorExit pour la synchronisation.

+0

Merci pour les suggestions. Je pense que la page ci-dessous sera utile, car elle parle de mutex en plus de MonitorEnter, etc. http://java.sun.com/docs/books/jni/html/other.html Je pense que ma question était un peu flou (synchroniser est probablement une solution, mais surveiller entrée/sortie pourrait fonctionner). J'ai réécrit la première partie à lire: 'J'ai un code objectif-c qui utilise un NSLock pour implémenter un type de transaction. L'objet est verrouillé sur une "transaction de début", plusieurs autres appels sont effectués avec le verrou en place, puis il est libéré avec un "commit". – spieden

+0

Autorisez-vous l'accès à partir de threads Java et non-Java? – jdigital

+0

Seulement à partir de threads Java. – spieden