Sto cercando di implementare una libreria nativa condivisa (.so) per il sistema Android. Naturalmente, ci sono alcuni blocchi di codice che devono essere thread-safe.
Ho scoperto here che pthreads blocchi, mutex o variabili di condizione non sono supportati.
Mi piacerebbe sapere cosa viene solitamente utilizzato a livello di libreria per ottenere la sicurezza del thread?Sicurezza thread nelle librerie Android
risposta
Il modo in cui questo può essere raggiunto dipende dal fatto che si desidera che sia thread-safe quando si accede da thread a livello Java oppure è necessario sincronizzare i thread nativi con i thread Java.
Ci sono due modi per sincronizzare solo le discussioni a livello di Java:
1. Il modo più semplice è quello di aggiungere il sincronizzato parola chiave ai metodi nativi che accessibili con filettatura multipla, vale a dire
public native synchronized int sharedAccess();
2.Synchronization dal lato origini:
(*env)->MonitorEnter(env, obj);
... /* synchronized block */
(*env)->MonitorExit(env, obj);
Fare riferimento here su come sincronizzare le discussioni nativi con Java infila
c'è un video DevBytes here che discute filettatura nel NDK. Uno schema utile discusso nel video sta facendo le scritture atomiche usando __atomic_swap
nel codice nativo.
È possibile utilizzare un singleton thread-safe. Anche se questo non è più un metodo molto popolare di operazioni atomiche thread safe, dal momento che tutte le cose singleton sono pessime, (quindi non mi aspetto molti voti). È veloce, leggero e funziona ancora, è stato pesantemente utilizzato in smalltalk e per un periodo in Java ed è stato considerato un modello di progettazione chiave.
public class ThreadSafeSingleton {
private static final Object instance = new Object();
protected ThreadSafeSingleton() {
}
// Runtime initialization
public static Object getInstance() {
return instance;
}
}
Questa una versione caricata pigro ...
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;
}
}
È possibile controllare questo post su Thread Safe Singletons in Java per maggiori informazioni.
Ho paura di aver frainteso l'articolo. L'implementazione bionica per Android di ** pthreads ** è abbastanza completa. Non è completamente conforme a POSIX, ma è utile a tutti gli scopi pratici. I mutex e le condizioni vars che "non sono supportati" sono * inter-process *, che non sono rilevanti per la tua libreria nativa condivisa, lavorando in un'app Android sandbox. Android definisce altri meccanismi di comunicazione e sincronizzazione tra processi. –