【问题标题】:Producer-consumer queue- std::queue or user-written linked-list?生产者-消费者队列- std::queue 还是用户编写的链表?
【发布时间】:2014-01-11 23:36:59
【问题描述】:

我看到了以下详细说明生产者消费者无锁队列的帖子:

C++ Lock free producer/consumer queue

它使用自定义编写的链表。编写一个链表的目的是什么,当一个人可以只使用std::queue 并在数据结构周围编写一些访问器包装器时?

【问题讨论】:

  • 您不能从非无锁数据结构创建无锁数据结构。您可以轻松地使其并发,但不能没有锁。
  • 无锁编程非常微妙,没有“快速而明显的方法”来做到这一点。不过,如果您真的感兴趣,我建议您花一到六周的时间研究该主题;这将是美好的时光。
  • @Casey 您能否详细说明为什么不呢?我想您是在直接回答为什么必须编写自己的数据结构而不是使用 std::queue?
  • 多个线程同时修改std::queue 是不安全的。您建议的“访问器包装器”必须确保一次只有一个线程可以调用包含的std::queue 的成员函数。您将有效地实现一种机制,该机制要求其他线程等待当前访问共享数据结构的线程完成,即锁。

标签: c++ multithreading c++11 queue producer-consumer


【解决方案1】:

不可能设计一个std::list,其中push_backpop_front 不能同时修改大小成员。如果您有两个线程同时调用它们,它们可能会破坏列表。您可以编写一个包装访问器以使其安全,通过使用锁。这违背了无锁结构的目标。 push_backstd::dequepop_front 都需要修改节点指针的内部“向量”,如果它们被两个不同的线程同时调用,它们会再次破坏双端队列。

可以轻松编写类似列表或循环缓冲区的无锁生产者/消费者队列,但没有标准 C++ 容器符合条件。

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多