Oracle Solaris Studio 12.2:C++ 用户指南

10.4.1.4 减少多线程安全类的性能开销

使用此版本的 libC 库中的 MT 安全类会导致一些性能开销,即使是单线程应用程序中也是如此,但如果使用 libCunsafe_ 类,则可避免此开销。

可以使用作用域解析运算符执行基类 unsafe_ 的成员函数,例如:


    cout.unsafe_ostream::put(’4’);

    cin.unsafe_istream::read(buf, len);

注 –

unsafe_ 类不能在多线程应用程序中安全地使用。


可以使 coutcin 对象成为不安全对象,然后执行正常操作,而不是使用 unsafe_ 类。这会稍微降低性能。以下示例说明了如何使用 unsafe coutcin


示例 10–4 禁用多线程安全


#include <iostream.h>
//disable mt-safety
cout.set_safe_flag(stream_MT::unsafe_object);    
//disable mt-safety
cin.set_safe_flag(stream_MT::unsafe_object);    
cout.put(”4’);
cin.read(buf, len);

iostream 对象是 MT 安全对象时,有互斥锁定保护对象的成员变量。该锁定给仅在单线程环境中执行的应用程序增加了不必要的开销。为了提高性能,可以动态地启用或禁用 iostream 对象的 MT 安全性。以下示例使 iostream 对象成为 MT 不安全的对象:


示例 10–5 切换到多线程不安全


fs.set_safe_flag(stream_MT::unsafe_object);// disable MT-safety
    .... do various i/o operations

可以在多个线程共享 iostream 的情况下(例如,在只有一个线程的程序中,或在每个 iostream 都是线程专用的程序中),在代码中安全地使用 MT 不安全的流。

如果显式在程序中插入同步,还可以在多个线程共享 iostream 的环境中安全地使用 MT 不安全的 iostream。以下示例说明了该技术:


示例 10–6 在多线程不安全的对象中使用同步


    generic_lock();
    fs.set_safe_flag(stream_MT::unsafe_object);
    ... do various i/o operations
    generic_unlock();

其中,函数 generic_lockgeneric_unlock 可以是使用诸如互斥锁、信号或读取器/写入器锁定等基元的任何同步机制。


注 –

libC 库提供的 stream_locker 类是实现这一目的的首选机制。


有关更多信息,请参见10.4.5 对象锁定