避免来自不同线程的堵塞碰撞的简单方法?

时间:2011-05-01 20:46:08

标签: c++ multithreading contention

我有一个多线程程序,其中两个独立的线程正在向std :: clog发送调试输出,并且输出是散布的。我想找到一种简单的方法来强制输出至少保持分开,除了输出中的换行符。这样,可以更容易地解释调试输出。在某些地方,我在输出之前插入了一个sleep(1),并在将输出发送到阻塞之前将输出收集到一个字符串中以减少碰撞的可能性,但我更喜欢一个更强大且更可靠的解决方案。 / p>

是否有一种简单的方法可以确保每个线程一次将整行写入std :: clog,然后另一个线程可以进入并编写自己的输出行?

3 个答案:

答案 0 :(得分:3)

没有特别简单的方法可以做到这一点,这里有一个关于它的扩展讨论:http://www.cplusplus.com/forum/general/27760/

这个问题在某种程度上得到了解决,创建了一个新的AtomicStream,它在流式传输任何其他内容之前以原子方式写入整行(这是通过缓冲技巧完成的)。你需要提出类似的解决方案。很抱歉非常简单的答案 - 线程同步将以某种方式将其纳入您的解决方案。

这可能是派生的,但如果您的std::clog重定向到某个文件,您也可能有多个文件用于多个线程。

答案 1 :(得分:1)

你......不能。您正在同时写入同一个流。 clog中的缓冲会有所帮助,但仍然无法保证。

除非您想同步线程的日志记录(对于您正在做的事情来说有点贵),否则您应该考虑使用日志记录工具(这将允许您记录说出不同文件的不同内容)。 / p>

答案 2 :(得分:0)

是的,您正在寻找跨线程同步方法。这些通常在操作系统的API中提供,您也可以在Boost中找到它。