代码之家  ›  专栏  ›  技术社区  ›  Fanatic23

C++中的并发队列

  •  2
  • Fanatic23  · 技术社区  · 14 年前

    我正在尝试设计一个可以同时被多个读/写线程访问的队列。我喜欢使用两个互斥锁,一个用于读写。写操作非常简单,锁定写互斥锁,附加数据,解锁,就完成了。

    问题在于阅读。如果in队列中没有数据,我希望我的线程等待数据可用。一个明显的方法是获取读互斥,并保持每N个时钟周期轮询一次队列,但这显然不是最好的方法。这就引出了条件变量。在C++中,是否有任何有条件变量(最好是基于pthOngices)的阻塞队列实现的好资源?

    具体来说,我看到了以下问题:

    1. 调用pthread\u cond\u broadcast而不是pthread\u cond\u signal可以吗?也许这可以避免pthread\u cond\u wait的问题。而且,这似乎更符合逻辑,因为多个读线程确实是一种可能。
    2. 似乎还必须使用相同的互斥锁来锁定读写器线程,才能使用条件变量。如果这是真的,那么我们有一个严重的问题。
    5 回复  |  直到 14 年前
        1
  •  2
  •   Andres Jaan Tack    14 年前

    this C++ threading blog post 应该给你一个参考实现,但我认为你是危险的成功接近自己。解决您的具体问题:

    1. 它是 没有服务员时发信号是违法的。这是完全合法的,你可以利用这个事实。(顺便说一句,你在哪里读到的?)
    2. pthread_cond_broadcast 导致一个主要问题: 一群大象 冲锋,哪里都有 n
    3. 您可以从任何地方发出信号,甚至从一个不必处理有问题的互斥体的线程发出信号。你的 pthread_cond_wait

    二者都 读写互斥锁。 如果没有,那么当队列大小为1并且读写器同时工作时会发生什么情况?

        2
  •  3
  •   Fanatic23    14 年前

    我有一个使用来自 http://danborn.net/code/ 但正如我前面提到的,因为它使用一个条件变量,所以它也使用1个互斥。

    这是增强版,同样是单互斥: http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

        3
  •  2
  •   Jim Lewis    14 年前

    我想你误解了什么——打电话是完全合法的 pthread_cond_signal 即使没有线程在此条件下等待。

    你的意思是“从队列的头上删除一个项目”,这会改变队列的状态 队列(换句话说,它也是一个“写”。)根据你的情况,最好从“消费者和生产者”的角度来考虑,而不是“读者和作者”。

    一个互斥锁(以保证对队列的独占访问)和两个条件变量(“可用数据”、“可用可用空间”)就足够了。(如果 我只是完整地提一下。)

    如果你的阅读线索是 严格地 读者(也就是说,他们 以任何方式修改共享队列数据结构,例如从队列中弹出一个项目) pthread_rwlock 电话族也可能是一个合适的解决方案。在这个范例中,有读锁(多个读卡器可以同时持有,但强制写入程序阻塞,直到读卡器完成)和写锁(确保持有写锁的线程独占访问,阻塞任何其他写入程序) 读卡器)。

        4
  •  1
  •   Ben Voigt    14 年前

        5
  •  0
  •   skimobear    14 年前

    下面是一个简单的boost::condition示例 here .