Я пытаюсь реализовать родную общую библиотеку (.so) для системы Android. Естественно, есть некоторые блоки кода, которые должны быть потокобезопасными.
Я обнаружил here, что блокировки, мьютексы или условия переменных pthreads не поддерживаются.
Хотелось бы узнать, что обычно используется на уровне библиотеки для обеспечения безопасности потоков?Безопасность потоков в Android-библиотеках
ответ
Как это может быть достигнуто, зависит от того, хотите ли вы, чтобы он был потокобезопасным при доступе по потокам уровня Java, или вам нужно синхронизировать собственные потоки с потоками Java.
Есть два способа синхронизации только темы на уровне Java:
1. Самый простой способ добавить синхронизированный ключевое слово нативных методов, которые будут доступны для множества ниток, т.е.
public native synchronized int sharedAccess();
2.Synchronization с родной стороны:
(*env)->MonitorEnter(env, obj);
... /* synchronized block */
(*env)->MonitorExit(env, obj);
См here о том, как синхронизировать собственные потоки с Java нитей
Существует DevBytes видео here, что обсуждает резьб в НДК. Один полезный шаблон, обсуждаемый в видео, выполняет атомарную запись с использованием __atomic_swap
в собственном коде.
Вы можете использовать поточный безопасный синглтон. Хотя это не очень популярный метод поточной безопасной атомной операции, так как все вещи singleton плохие (так что я не ожидаю много голосов). Он быстрый, легкий и по-прежнему работает, он был сильно использован в smalltalk и некоторое время на Java и считался ключевым шаблоном дизайна.
public class ThreadSafeSingleton {
private static final Object instance = new Object();
protected ThreadSafeSingleton() {
}
// Runtime initialization
public static Object getInstance() {
return instance;
}
}
Это ленивый загружается версия ...
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;
}
}
Вы можете проверить это сообщение на Thread Safe Singletons in Java для получения дополнительной информации.
Я боюсь, что вы неправильно поняли статью. Биологическая реализация Android ** pthreads ** довольно полна. Он не полностью совместим с POSIX, но хорош для всех практических целей. Мьютексы и условия, которые «не поддерживаются», являются * межпроцессорными *, которые не имеют отношения к вашей собственной общей библиотеке, работающей в изолированном Android-приложении. Android определяет другие механизмы взаимодействия и синхронизации между процессами. –