具有锁的队列数据结构需要什么?

时间:2014-10-07 20:11:54

标签: multithreading data-structures parallel-processing queue

我试图通过并行编程来理解不同的数据结构,为面试做准备。

我想知道我是否要实现一个带锁的队列,我需要扩展哪种功能?

我问的原因是,似乎我必须确保在任何给定时间允许一个线程访问队列,还有更多吗?

1 个答案:

答案 0 :(得分:0)

将串行数据结构扩展为适合并行或并发编程的问题是一个棘手的问题。它并不像采取实施并用锁保护每个功能或方法那么容易;只是确保在任何给定时间只允许一个线程访问/修改容器是不够的。

例如,让我们从标准C ++库中获取队列:std::queue。从队列e中弹出元素q的典型代码如下:

if (!q.empty()) {
    e = q.front();
    q.pop();
}

让我们假设一个锁被添加到队列实现中,并且队列的每个方法都在内部受到锁的保护。不幸的是,这段代码对于并发仍然不安全。如果多个线程从队列中弹出元素,则只要在方法内释放锁定,empty()的结果就会变得不可靠,因为另一个线程可能会弹出该线程之前的最后一个元素。另一个问题是两个或多个线程可能从front()中获得相同的值,但随后将不同的项目从队列中弹出。

要正常工作,上面的代码应该用锁保护,这意味着锁应该在队列外部。或者,应该将一个实现上述操作的新方法添加到队列中,并且应该删除或声明现有方法不安全;即容器的接口可能需要改变线程安全性。