現バージョンの libC ライブラリの「MT-安全」のクラスを使用すると、シングルスレッドのアプリケーションの場合でもパフォーマンスのオーバーヘッドが起こります。 libC ライブラリの unsafe_ クラスを使用すると、オーバーヘッドはなくなります。
次の例のように、スコープ決定演算子を使用して unsafe_ 基底クラスのメンバー関数を実行することができます。
cout.unsafe_ostream::put('4');
cin.unsafe_istream::read(buf, len);
マルチスレッド対応のアプリケーションでは、unsafe_ クラスの使用は危険です。
次の例のように、unsafe_ クラスを使用する代わりに、cout オブジェクトと cin オブジェクトを「MT-安全ではない」として、通常の操作を使用することもできます。この場合、パフォーマンスはわずかに低下します。
#include <iostream.h> cout.set_safe_flag(stream_MT::unsafe_object); //「MT-安全ではない」に設定 cin.set_safe_flag(stream_MT::unsafe_object); //「MT-安全ではない」に設定 cout.put('4'); cin.read(buf, len);
iostream オブジェクトが「MT-安全」である場合は、相互排他ロック機能が提供されてオブジェクトのメンバー変数が保護されます。このロック機能のため、シングルスレッド環境でのみ実行されるアプリケーションの場合は不要なオーバーヘッドがかかります。 次の例のように、iostream オブジェクトの「MT-安全」と「MT-安全ではない」を動的に切り換えて、パフォーマンスを向上させることができます。
fs.set_safe_flag(stream_MT::unsafe_object);//「MT-安全ではない」に設定 ... さまざまな入出力操作を実行
iostream が複数スレッドに共有されない場合、たとえばスレッドが 1 つしかないプログラムや、各 iostream がそれぞれのスレッドに対して非公開なプログラムの場合は、 「MT-安全ではない」のストリームを使用しても問題ありません。
また次の例のように、プログラム内で明示的に同期を取らせる場合は、iostream が複数スレッドに共有される環境で「MT-安全ではない」の iostream を使用しても問題ありません。
generic_lock() ; fs.set_safe_flag(stream_MT::unsafe_object) ; ... さまざまな入出力操作を実行 generic_unlock() ;
ここで、generic_lock と generic_unlock の関数は、相互排他、セマフォ、読み取り/書き込みのような単純型を使用した同期機構を提供するものであれば何でもかまいません。
このような目的で使用するには、libC ライブラリで提供されている stream_locker クラスをお勧めします。
詳細は、「オブジェクトのロック」を参照してください。