依靠额外的线程-线程安全

cout on extra thread - thread safety

本文关键字:线程 安全 依靠      更新时间:2023-10-16

我的主线程中有一个非常时间敏感的任务。然而,我也想同时打印一些关于这个任务的信息。

问题: cout需要一些时间来执行,因此减慢了主线程中时间敏感的任务。

Idea:我考虑创建一个额外的线程来处理输出。为了在主线程和新创建的线程之间进行通信,我考虑了一个包含要打印的字符串的向量。在新创建的线程中,无限while循环将一个接一个地打印这些字符串。

的问题:向量不是线程安全的。因此,我担心锁定和解锁向量所花费的时间几乎与在主线程中直接调用cout所花费的时间一样多。

问题:是否有锁定/解锁vector的替代方法?我对矢量锁定的担心被误导了吗?你会采取完全不同的方法来解决这个问题吗?

根据任务的时间敏感性,我可能会在生产者线程中构建一个输出向量,然后将整个向量传递给消费者线程(并根据需要重复)。

两者之间的队列需要是线程安全的,但是您可以通过每隔50-100毫秒左右传递一个向量来保持最小的开销。对于大多数观察者来说,这仍然足够短,看起来像是实时的,但是在大多数情况下,足够长的时间可以使锁定的开销保持在很低的水平,而不必关心。

您可以使用在"中断"编程中经常看到的想法-将数据从线程发送到环缓冲区。然后,在另一个线程中,从环缓冲区中打印。实际上,在"美好的过去",人们可以在没有任何"原子"的情况下编写环缓冲区(在某些嵌入式系统上仍然可以这样做)。

但是,即使是原子,环缓冲区也不难写。这里有一个实现:c++ threadsafe ringbuffer实现(未经测试,但乍一看似乎没问题)。