10

Я пытаюсь реализовать родную общую библиотеку (.so) для системы Android. Естественно, есть некоторые блоки кода, которые должны быть потокобезопасными.

Я обнаружил here, что блокировки, мьютексы или условия переменных pthreads не поддерживаются.

Хотелось бы узнать, что обычно используется на уровне библиотеки для обеспечения безопасности потоков?Безопасность потоков в Android-библиотеках

+1

Я боюсь, что вы неправильно поняли статью. Биологическая реализация Android ** pthreads ** довольно полна. Он не полностью совместим с POSIX, но хорош для всех практических целей. Мьютексы и условия, которые «не поддерживаются», являются * межпроцессорными *, которые не имеют отношения к вашей собственной общей библиотеке, работающей в изолированном Android-приложении. Android определяет другие механизмы взаимодействия и синхронизации между процессами. –

ответ

4

Как это может быть достигнуто, зависит от того, хотите ли вы, чтобы он был потокобезопасным при доступе по потокам уровня Java, или вам нужно синхронизировать собственные потоки с потоками Java.

Есть два способа синхронизации только темы на уровне Java:

1. Самый простой способ добавить синхронизированный ключевое слово нативных методов, которые будут доступны для множества ниток, т.е.

public native synchronized int sharedAccess(); 

2.Synchronization с родной стороны:

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

См here о том, как синхронизировать собственные потоки с Java нитей

1

Существует DevBytes видео here, что обсуждает резьб в НДК. Один полезный шаблон, обсуждаемый в видео, выполняет атомарную запись с использованием __atomic_swap в собственном коде.

0

Вы можете использовать поточный безопасный синглтон. Хотя это не очень популярный метод поточной безопасной атомной операции, так как все вещи 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 для получения дополнительной информации.