【问题标题】:What does Queue Data structure with locks entail?带锁的队列数据结构需要什么?
【发布时间】:2014-10-07 20:11:53
【问题描述】:

我正在尝试通过并行编程了解不同的数据结构以准备面试。

我想知道如果我要实现一个带锁的队列,我必须扩展什么样的功能?

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

【问题讨论】:

  • 是的,您只需要确保以同步方式访问队列元素,以确保两次写入不会影响这一点。此外,根据始终读取正确更新值的限制​​,您也应该以同步方式授予读取访问权限。

标签: multithreading data-structures parallel-processing queue


【解决方案1】:

扩展串行数据结构以适用于并行或并发编程的问题是一个棘手的问题。这不像实现并用锁保护每个函数或方法那么容易;仅仅确保在任何给定时间只允许一个线程访问/修改容器是不够的。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2020-10-08
    • 1970-01-01
    • 2019-07-08
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多