依靠额外的线程-线程安全
cout on extra thread - thread safety
我的主线程中有一个非常时间敏感的任务。然而,我也想同时打印一些关于这个任务的信息。
问题: cout
需要一些时间来执行,因此减慢了主线程中时间敏感的任务。
Idea:我考虑创建一个额外的线程来处理输出。为了在主线程和新创建的线程之间进行通信,我考虑了一个包含要打印的字符串的向量。在新创建的线程中,无限while循环将一个接一个地打印这些字符串。
的问题:向量不是线程安全的。因此,我担心锁定和解锁向量所花费的时间几乎与在主线程中直接调用cout
所花费的时间一样多。
问题:是否有锁定/解锁vector的替代方法?我对矢量锁定的担心被误导了吗?你会采取完全不同的方法来解决这个问题吗?
根据任务的时间敏感性,我可能会在生产者线程中构建一个输出向量,然后将整个向量传递给消费者线程(并根据需要重复)。
两者之间的队列需要是线程安全的,但是您可以通过每隔50-100毫秒左右传递一个向量来保持最小的开销。对于大多数观察者来说,这仍然足够短,看起来像是实时的,但是在大多数情况下,足够长的时间可以使锁定的开销保持在很低的水平,而不必关心。
您可以使用在"中断"编程中经常看到的想法-将数据从线程发送到环缓冲区。然后,在另一个线程中,从环缓冲区中打印。实际上,在"美好的过去",人们可以在没有任何"原子"的情况下编写环缓冲区(在某些嵌入式系统上仍然可以这样做)。
但是,即使是原子,环缓冲区也不难写。这里有一个实现:c++ threadsafe ringbuffer实现(未经测试,但乍一看似乎没问题)。
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区