Разрешение небезопасной резьбы в массивах - PullRequest
0 голосов
/ 12 марта 2012

У меня есть приложение Java, которое выполняет некоторую обработку изображения в реальном времени, данные изображения хранятся в больших массивах int.

Обновления для частей массива изображений происходят постоянно из нескольких потоков (это в основном для визуализации очень большого объема потока входящих событий).

Читатели должны взять копии частей массива изображений для отображения и / или дальнейшей обработки.

Из-за необходимости высокой пропускной способности я хочу избежать дорогостоящей синхронизации для обработки одновременного доступа. Кроме того, иногда допускаются небольшие визуальные ошибки, например, если читатель копирует раздел изображения, который был только частично обновлен для данного входящего события. По сути, я хочу расслабить безопасность потоков, чтобы обеспечить максимальную пропускную способность.

Этот подход сработает? Любые ошибки, о которых я должен знать?

1 Ответ

1 голос
/ 13 марта 2012

Предположительно, вы предлагаете разделить массив и разрешить доступ к каждому разделу только одному потоку.Это разумный подход без проблем.

На самом деле, это делает инфраструктура форка / соединения и может быть применима к тому, что вы пытаетесь достичь.

Например, посмотрите на javadocs для java.util.concurrent.RecursiveAction , который показывает пример разбиения массива для его сортировки.В двух словах, массив разделяется до тех пор, пока размер раздела не станет ниже порогового значения.Каждый из последующих разделов затем разделяется снова (т.е. рекурсивно).

Код выглядит следующим образом:

 class SortTask extends RecursiveAction {
    final long[] array; final int lo; final int hi;
    SortTask(long[] array, int lo, int hi) {
    this.array = array; this.lo = lo; this.hi = hi;
 }

 protected void compute() {
    if (hi - lo < THRESHOLD)
       sequentiallySort(array, lo, hi);
    else {
       int mid = (lo + hi) >>> 1;
       invokeAll(new SortTask(array, lo, mid),
                 new SortTask(array, mid, hi));
       merge(array, lo, hi);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...