在多线程程序中序列化 err.h 个调用

Serializing err.h calls in a mulit-threaded program

我的程序使用 <err.h> 函数(如 warnx(3))来发出诊断信息。 有时多个线程同时进行报告,导致输出行重叠。

这没什么大不了的,但是如果有一个简单的修复方法,我想实现它...有吗?

(线程全部由 OpenMP 管理。)

避免交错打印警告的最简单解决方案是使用 OpenMP 临界区。为此,可以在包装函数中使用指令 #pragma omp critical 代替 warnx 调用。

请注意,stdio/stderr 访问应该已经被锁定,也就是说,关于对其执行的操作类型,锁定不能保证按照您想要的方式切割行或行块。例如,如果您对 warnx 进行多次调用,但如果 warnx 的实现使用对 fprintf 的多次调用(正如您在评论中指出的那样),则尤其如此。