【发布时间】:2018-10-23 16:21:40
【问题描述】:
我在 C++ 中的多线程应用程序方面没有太多经验,我目前正在尝试设计一个具有四个线程和三个共享队列的应用程序。这是我一年前用 Python 编写的应用程序的 C++ 版本,但它的运行速度不够快,无法满足新的要求(我一直想在 C++ 中学习多线程,所以这似乎是一个好机会)。
计划的线程是:
1) 从文件末尾抓取行的线程(相当于在 linux CL 中运行 tail -f)
2) 线程处理文件中的行
3) 线程将处理后的行发送到别处
4) 在日志文件中写入调试输出的可选线程(是否使用在运行时指定)
我打算使用的队列设置是:
线程 1 和 2 之间的一个共享队列;线程 1 放入物品,线程 2 取出物品。永远不要反过来。线程 2 和 3 的一个共享队列,其行为方式与前者相同。第三个可选队列,前三个线程都写入,第四个线程读取。
我遇到的问题是,与 Python 中的 multiprocessing.Queue() 对象不同,C++ 队列默认不是线程安全的,我还没有找到标准的共享队列实现。
问题:
1) 我在 Python 中使用的基本大纲(上图)可以在 C++ 中重复使用,而开发起来不会一团糟吗?
2) 是否有我尚未找到的线程安全队列的标准实现,或者我必须求助于外来库(例如 Boost)还是自己制作?
【问题讨论】:
-
boost 有你需要的东西:boost.org/doc/libs/1_59_0/doc/html/lockfree.html
-
出于好奇,您是否证明了在步骤 1、2 和 3 中使用单独的线程比使用单个线程在循环中执行所有三个步骤更好?
-
@SolomonSlow 在 Python 中,在单个线程中循环执行所有步骤(这是我第一次尝试实现设计的方式)对于原始要求来说太慢了。更改为多线程(由于 GIL 应用于那里的“线程”,在 Python 中技术上是“多处理”)实现将事情加速到可接受的水平。
-
那么,如果你重叠输入、输出和计算,进程可以跟上,但如果你不重叠它们,它就落后了?这并没有在成功和失败之间留下很大的空间。如果您认为您的程序所使用的消防水带在未来可能会流得更快,那么现在开始考虑一个不同的、更可扩展的架构还为时不早,但与此同时......
-
我不会将 boost 称为“异国情调”的库,它被广泛使用,而且它的许多库正在寻找进入 c++ 标准库的途径
标签: c++ multithreading queue