FIFO队列同步

时间:2009-01-12 21:59:16

标签: algorithm multithreading synchronization

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

5 个答案:

答案 0 :(得分:4)

“同步”是什么意思?如果你的读者和writer在单独的线程中,您希望FIFO“正确”处理并发,包括以下详细信息:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

尝试使用此代码进行并发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;
}

}

答案 3 :(得分:0)

取决于实施,但最有可能。您不希望读者阅读部分书面数据。

答案 4 :(得分:0)

是的,除非其文件另有明确说明。

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

相关问题