Безопасность потоков в библиотеках Android

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

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

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

Ответ 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 для получения дополнительной информации.