【问题标题】:Should I implement a thread-safe queue using the singleton design pattern or something else?我应该使用单例设计模式还是其他方式来实现线程安全队列?
【发布时间】:2019-03-27 15:41:34
【问题描述】:

我想实现一个多线程队列as in this example

但我的问题是要了解完整的模型。

为了让每个线程都推送/弹出到同一个队列中,我必须将 SafeQueue 设为 Singleton。这是正确的吗?

比我需要一些线程安全的单例初始化吗?

应该是这样的:

____________
|          |
| Thread 1 |  ---------
|__________|          |
                      |
____________          ----------> ____________
|          |                      |          |
| Thread 2 |  ------------------> |   Queue  |
|__________|                      |__________|
                       --------->
____________          |
|          |          |
| Thread 3 |-----------
|__________|

或者我应该在创建线程之前启动队列并将队列对象传递给每个线程吗?

【问题讨论】:

  • 不需要单例,线程可以共享同一个队列对象。重要的是保护推送和弹出不会同时访问。
  • 推送/弹出将受到互斥锁的保护。 “......线程无论如何都可以共享相同的队列对象......” -> 我应该怎么做?
  • 看看here
  • 线程不像进程。进程中的所有线程共享内存。您可以将一个对象的指针或引用传递给所有线程,只要该对象处于活动状态,所有线程都可以取消引用该指针或引用。
  • 好的,所以这应该和我的最后一句话一样(或者我应该在创建线程之前启动队列并将队列对象传递给每个线程?)对吗?

标签: c++ multithreading


【解决方案1】:

正如@some-programmer-dude 所指出的,您不必强制使用单例,只需在所有感兴趣的线程之间共享同一个队列实例。因此,首先创建队列,然后创建应该访问队列的线程。

然后,到并发。容器线程安全是双重的,队列肯定是一个容器:

  • 容器级完整性。任何推送/弹出都应该使用跨线程同步来完成,这样我们就不会出现两个线程看到队列的两个版本(或一个损坏的版本)的情况。
  • 元素级完整性。这不是队列的主要情况(例如,与向量或映射不同),但是您不应该有两个不同线程竞争修改相同队列元素的场景(如果您的队列支持对第一个和最后一个的引用项目)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多