我应该使用单例设计模式还是其他方式实现线程安全队列?

时间:2018-10-23 11:52:16

标签: c++ multithreading

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

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

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

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

它应该像这样:

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

还是我应该在创建线程之前启动队列并将Queue-Object传递到每个单独的线程中?

1 个答案:

答案 0 :(得分:3)

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

然后,进行并发。容器线程安全性有两个方面,而队列肯定是容器:

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