确保流对象的线程安全

iostream 标准库中声明的所有类都是可重入的,并且使用单个锁定来确保线程安全,同时防止发生死锁。 但是,在多处理器机器上,当两个不同线程尝试同时访问共享流对象时,或者当流对象在等待输入 (例如,从键盘) 时挂起锁定时,可能会发生 livelock (尽管很少)。

基于 XL 的前端开始

如果要避免存在 livelock 的可能性,可以在编译时使用以下宏在输入流对象和/或输出流对象中禁用锁定:

__NOLOCK_ON_INPUT
禁用输入锁定。
__NOLOCK_ON_OUTPUT
禁用输出锁定。
要使用其中一个或两个宏,请在编译命令行上使用 -D 选项作为宏名称的前缀。 例如:
xlC_r -D__NOLOCK_ON_INPUT -D__NOLOCK_ON_OUTPUT a.C
或者,您可以在运行时使用以下环境变量在输入流对象和/或输出流对象中禁用锁定:
XLCPP_NOLOCK_ON_INPUT
禁用输入锁定。
XLCPP_NOLOCK_ON_OUTPUT
禁用输出锁定。
例如,可以使用以下命令在输入流对象中禁用锁定:
export XLCPP_NOLOCK_ON_INPUT=1

建议您使用环境变量来禁用流对象中的锁定。

但是,如果对输入或输出对象禁用锁定,那么在线程之间共享流对象时,必须在源代码中提供相应的锁定机制。 如果没有,那么行为未定义,可能会发生数据损坏或应用程序崩溃。

注: 如果使用 OpenMP 伪指令或 -qsmp 选项将共享输入/输出流对象的代码与锁定禁用宏自动并行化,那么将运行与实现 Pthread 或其他多线程构造的代码相同的风险,并且需要相应地同步线程。
基于 XL 的前端端