1

如果只有一个读取器和一个写入器,是否应该同步 FIFO 队列?

4

5 回答 5

4

“同步”是什么意思?如果您的阅读器和编写器位于不同的线程中,您希望 FIFO“正确”处理并发,包括以下详细信息:

  • 正确使用 FIFO API 绝不会导致数据结构损坏
  • 正确使用 FIFO API 不应导致死锁(尽管应该有一种机制让读者等到有东西要读)
  • 从 FIFO 读取的对象应该是相同的对象,以相同的顺序写入 FIFO(不应丢失对象或重新排列顺序)
  • 在作者将某些内容放入 FIFO 与读者可以使用之间应该有一个有限的时间(希望如此!)。

在 Java 世界中,有一本很好的书,Java Concurrency In Practice。有多种方法可以实现正确处理并发的 FIFO。最简单的实现是阻塞,更复杂的实现使用基于当今大多数处理器上的比较和交换指令的非阻塞算法。

于 2009-01-12T23:40:20.127 回答
2

是的,如果读写器与来自不同线程的 FIFO 队列交互。

于 2009-01-12T22:02:15.987 回答
0

取决于实施,但最有可能。您不希望阅读器读取部分写入的数据。

于 2009-01-12T22:05:25.027 回答
0

是的,除非其文档明确说明。

(如果只有一个读取器和一个写入器线程,则可以实现不需要同步的专用 FIFO,例如在 Windows 上使用 InterlockedXXX 函数。)

于 2009-01-12T22:09:07.453 回答
0

尝试使用此代码来同时使用 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;
}

}

于 2009-12-05T20:24:46.870 回答