cout额外的线程 - 线程安全

时间:2015-10-14 22:14:36

标签: c++ multithreading vector io

我的主线程中有一个非常敏感的任务。但是,我还想同时打印一些有关此任务的信息。

问题cout需要一些时间来执行,因此会降低主线程中对时间敏感的任务的速度。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

两者之间的队列需要是线程安全的,但你可以通过传递一个向量来保持开销小,例如50-100毫秒左右。对于大多数观察者而言,这仍然足够短,看起来像实时,但足够长,足以在大多数情况下保持锁定的开销太低而无法关注。

答案 1 :(得分:1)

你可以使用经常在"中断"中看到的想法。编程 - 将数据从线程发送到环形缓冲区。然后,在另一个线程中,从环形缓冲区打印。实际上,在过去的好日子里,人们可以写一个没有任何"原子的环形缓冲区" (并且仍然可以在某些嵌入式系统上执行)。

但是,即使使用原子,环形缓冲区也难以编写。这里有一个实现:c++ threadsafe ringbuffer implementation(未经测试,但第一眼看上去似乎没问题。)