我有一个多线程程序,其中两个单独的线程将调试输出发送到 std::clog 并且输出穿插。我想找到一种简单的方法来强制输出至少保持独立,除了输出中的换行符。这样,可以更容易地解释调试输出。在某些地方,我在输出之前插入了一个 sleep(1) 并将输出收集到一个字符串中,然后再将其发送到 clog 以减少碰撞的机会,但我更喜欢一个更强大和确定触发的解决方案。
有没有一种简单的方法可以确保每个线程在另一个线程可以进入并写入自己的输出行之前一次向 std::clog 写入一整行?
我有一个多线程程序,其中两个单独的线程将调试输出发送到 std::clog 并且输出穿插。我想找到一种简单的方法来强制输出至少保持独立,除了输出中的换行符。这样,可以更容易地解释调试输出。在某些地方,我在输出之前插入了一个 sleep(1) 并将输出收集到一个字符串中,然后再将其发送到 clog 以减少碰撞的机会,但我更喜欢一个更强大和确定触发的解决方案。
有没有一种简单的方法可以确保每个线程在另一个线程可以进入并写入自己的输出行之前一次向 std::clog 写入一整行?
没有特别简单的方法可以做到这一点,这里有一个关于它的扩展讨论:http ://www.cplusplus.com/forum/general/27760/
AtomicStream
在流式传输其他任何内容之前,通过创建一个原子地写入整行的 new 来解决这个问题(这是通过缓冲技巧完成的)。你需要想出一个类似的解决方案。很抱歉这个不容易回答 - 线程同步必须以某种方式进入您的解决方案。
这可能是派生的,但如果您std::clog
重定向到一个文件,您还可以为多个线程创建多个文件。
你……不能。您正在同时写入同一个流。缓冲clog
会有所帮助,但仍然不能保证。
除非您想同步线程的日志记录(对于您正在做的事情来说有点昂贵),否则您应该考虑使用日志记录工具(这将允许您记录不同的文件来处理不同的事情)。
是的,您正在寻找一种跨线程同步方法。这些通常在操作系统的 API 中可用,您也可以在 Boost 中找到。