Я пытаюсь реализовать собственную общую библиотеку (.so) для системы Android. Естественно, есть некоторые блоки кода, которые должны быть потокобезопасными.
Я обнаружил здесь, что блокировки pthreads, мьютексы или переменные условия не поддерживаются.
Я хотел бы знать, что обычно используется на уровне библиотеки для обеспечения безопасности потоков?
Безопасность потоков в библиотеках Android
Ответ 1
Как это может быть достигнуто, зависит от того, хотите ли вы, чтобы он был потокобезопасным при доступе к потокам уровня Java, или вам нужно синхронизировать собственные потоки с потоками Java.
Существует два способа синхронизации потоков только уровня Java:
1. Самый простой способ - добавить синхронизированное ключевое слово в собственные методы, к которым обращаются несколько потоков, т.е.
public native synchronized int sharedAccess();
2. Синхронизация с внутренней стороны:
(*env)->MonitorEnter(env, obj);
... /* synchronized block */
(*env)->MonitorExit(env, obj);
Обратитесь здесь о том, как синхронизировать собственные потоки с потоками Java
Ответ 2
Существует видео DevBytes здесь, в котором обсуждаются потоки в NDK. Один полезный шаблон, обсуждаемый в видео, выполняет атомарную запись с использованием __atomic_swap
в собственном коде.
Ответ 3
Вы можете использовать поточный безопасный синглтон. Хотя это не очень популярный метод поточной безопасной атомной операции, так как все вещи 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 в Java для получения дополнительной информации.