在多线程程序中序列化 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
的多次调用(正如您在评论中指出的那样),则尤其如此。
我的程序使用 <err.h>
函数(如 warnx(3)
)来发出诊断信息。 有时多个线程同时进行报告,导致输出行重叠。
这没什么大不了的,但是如果有一个简单的修复方法,我想实现它...有吗?
(线程全部由 OpenMP 管理。)
避免交错打印警告的最简单解决方案是使用 OpenMP 临界区。为此,可以在包装函数中使用指令 #pragma omp critical
代替 warnx
调用。
请注意,stdio/stderr 访问应该已经被锁定,也就是说,关于对其执行的操作类型,锁定不能保证按照您想要的方式切割行或行块。例如,如果您对 warnx
进行多次调用,但如果 warnx
的实现使用对 fprintf
的多次调用(正如您在评论中指出的那样),则尤其如此。