10

Ich versuche, eine native Shared Library (.so) für das Android-System zu implementieren. Natürlich gibt es einige Codeblöcke, die threadsicher sein müssen.

Ich fand here, dass Pthreads Sperren, Mutexe oder Zustandsvariablen nicht unterstützt werden.

Ich würde gerne wissen, was normalerweise auf der Ebene der Bibliothek verwendet wird, um Thread-Sicherheit zu erreichen?Threadsicherheit in Android-Bibliotheken

+1

Ich fürchte, Sie haben den Artikel missverstanden. Android bionische Implementierung von ** Pthreads ** ist ziemlich vollständig. Es ist nicht vollständig POSIX-konform, aber für alle praktischen Zwecke geeignet. Die Mutexe und Bedingungsvariablen, die "nicht unterstützt werden" sind * prozessübergreifende *, die für Ihre native, gemeinsam genutzte Bibliothek nicht relevant sind und in einer Sandkasten-Android-App funktionieren. Android definiert andere prozessübergreifende Kommunikations- und Synchronisationsmechanismen. –

Antwort

4

Wie dies erreicht werden kann, hängt davon ab, ob es nur threadsicher sein soll, wenn Java-Threads darauf zugreifen, oder native Threads mit Java-Threads synchronisiert werden müssen.

Es gibt zwei Möglichkeiten nur Java Ebene Threads zu synchronisieren:

1.Die einfachste Weg ist, hinzuzufügen, um das synchronisierte Schlüsselwort zu den nativen Methoden, die durch Mehrfachgewinde, dh

public native synchronized int sharedAccess(); 
zugänglich

2.Synchronization von der nativen Seite:

(*env)->MonitorEnter(env, obj); 
...      /* synchronized block */ 
(*env)->MonitorExit(env, obj); 

Siehe here wie native Threads synchronisieren mit Java-Threads

1

Es gibt ein DevBytes Video here, die in den NDK bespricht Threading. Ein nützliches Muster, das in dem Video diskutiert wird, ist atomare Schreibvorgänge unter Verwendung von __atomic_swap im systemeigenen Code.

0

Sie könnten ein thread safe-Singleton verwenden. Dies ist zwar keine sehr populäre Methode des threadsicheren Atombetriebs, da alle Dinge Singleton schlecht sind (also erwarte ich nicht viele Ups). Es ist schnell, leichtgewichtig und funktioniert immer noch, es wurde stark in Smalltalk und zeitweise in Java verwendet und galt als ein Schlüsseldesignmuster.

public class ThreadSafeSingleton { 

    private static final Object instance = new Object(); 

    protected ThreadSafeSingleton() { 
    } 

    // Runtime initialization 

    public static Object getInstance() { 
     return instance; 
    } 
} 

Dies ist eine faule geladene Version ...

public class LazySingleton { 
    private Singleton() { 
    } 

    private static class LazyInstance { 
     private static final Singleton INSTANCE = new Singleton(); 
    } 
     // Automatically ThreadSafe 
    public static Singleton getInstance() { 
     return LazyInstance.INSTANCE; 
    } 
} 

Sie können für mehr Info auf Thread Safe Singletons in Java diesen Beitrag sehen.

Verwandte Themen