Синхронизация очереди FIFO - PullRequest
0 голосов
/ 13 января 2009

Должна ли быть синхронизирована очередь FIFO, если есть только один читатель и один писатель?

Ответы [ 5 ]

4 голосов
/ 13 января 2009

Что вы подразумеваете под "синхронизированными"? Если ваш читатель и писатель находятся в отдельных потоках, вы хотите, чтобы FIFO обрабатывал параллелизм «правильно», включая такие детали, как:

  • правильное использование FIFO API никогда не должно приводить к повреждению структур данных
  • правильное использование FIFO API не должно вызывать взаимоблокировку (хотя должен быть механизм, позволяющий читателю ждать, пока что-то будет прочитано)
  • объекты, считываемые из FIFO, должны быть одинаковыми объектами в том же порядке, записанными в FIFO (не должно быть пропущенных объектов или в порядке перестановки)
  • должно быть ограниченное время (можно надеяться!) Между тем, когда писатель помещает что-то в FIFO, и когда это доступно для читателя.

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

2 голосов
/ 13 января 2009

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

1 голос
/ 05 декабря 2009

Попробуйте этот код для одновременного использования fifo:

public class MyObjectQueue {

private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

private static final ReadLock readLock;

private static final WriteLock writeLock;

private static final LinkedList<MyObject> objects;

static {
    readLock = lock.readLock();
    writeLock = lock.writeLock();
    objects = new LinkedList<MyObject>();
}

public static boolean put(MyObject p) {
    writeLock.lock();
    try {
        objects.push(p);            
        return objects.contains(p);
    } finally {
        writeLock.unlock();
    }
}

public static boolean remove(MyObject p) {
    writeLock.lock();
    try {
        return objects.remove(p);           
    } finally {
        writeLock.unlock();
    }
}

public static boolean contains(MyObject p) {
    readLock.lock();
    try {
        return objects.contains(p);         
    } finally {
        readLock.unlock();
    }
}   

public MyObject get() {
    MyObject o = null;
    writeLock.lock();
    try {
        o = objects.getLast();
    } catch (NoSuchElementException nse) {
        //list is empty
    } finally {
        writeLock.unlock();
    }
    return o;
}

}

0 голосов
/ 13 января 2009

Да, если в документации явно не указано иное.

(Возможно реализовать специализированный FIFO, который не нуждается в синхронизации, если имеется только один читатель и один поток записи, например, в Windows с использованием функций InterlockedXXX.)

0 голосов
/ 13 января 2009

В зависимости от реализации, но, скорее всего. Вы не хотите, чтобы читатель читал частично записанные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...