1.22 ARM C++ ライブラリでのスレッドセーフティ

ARM C++ ライブラリ関数は、常にスレッドセーフ、決してスレッドセーフにはならない、または状況によってはスレッドセーフのいずれかです。

ここで説明する内容では、C++ ライブラリにおけるスレッドセーフティの概要を説明します。
  • 関数 std::set_new_handler() は、スレッドセーフではありません。つまり、::operator new および ::operator delete の一部の形態は、std::set_new_handler() に関してスレッドセーフではありません。
    • 以下の C++ ランタイムライブラリ関数のデフォルト実装では malloc()free() を使用しており、これらの関数は相互にスレッドセーフです。ただし、これらの関数は std::set_new_handler() に対してはスレッドセーフではありません。これらの関数は置き換えることもできます。
      ::operator new(std::size_t)
      ::operator new[](std::size_t)
      ::operator new(std::size_t, const std::nothrow_t&)
      ::operator new[](std::size_t, const std::nothrow_t)
      ::operator delete(void*)
      ::operator delete[](void*)
      ::operator delete(void*, const std::nothrow_t&)
      ::operator delete[](void*, const std::nothrow_t&)
    • 以下の配置関数もスレッドセーフです。これらを置き換えることはできません。
      ::operator new(std::size_t, void*)
      ::operator new[](std::size_t, void*)
      ::operator delete(void*, void*)
      ::operator delete[](void*, void*)
  • グローバルオブジェクトの構築と破棄はスレッドセーフではありません。
  • __cxa_guard_acquire()__cxa_guard_release()__cxa_guard_abort()__cxa_atexit()、および __aeabi_atexit() の各関数を適切に再実装した場合、ローカルなスタティックオブジェクトの構築をスレッドセーフにすることができます。例えば、適切な再実装により、以下のような lsobj の構築をスレッドセーフにすることができます。
    struct T { T(); }; void f() { static T lsobj; }
    
  • 呼び出されたユーザコンストラクタおよびデストラクタもスレッドセーフの場合、例外のスローはスレッドセーフになります。
  • ARM C++ ライブラリは ARM C ライブラリを使用します。マルチスレッド環境で ARM C++ ライブラリを使用するには、マルチスレッド環境で ARM C ライブラリを使用する場合に必要な関数と同じものを提供する必要があります。

Rogue Wave 標準 C++ ライブラリ

Rogue Wave 標準 C++ ライブラリは、ARM C++ ライブラリの一部です。ARM C++ ライブラリに当てはまるものは、Rogue Wave 標準 C++ ライブラリにも当てはまります。Rogue Wave 標準 C++ ライブラリでは、以下のものに当てはまります。
  • すべてのコンテナと関数が再入可能で、内部の修正可能なスタティックデータを使用しません。
    • スタティックデータを使用して乱数ジェネレータの状態を記録する std::random_shuffle 関数を除きます。
  • iostream および locale クラスはスレッドセーフではありません。
iostreamlocale クラス、および std::random_shuffle 関数を使用中は、共有オブジェクトを保護する必要があります。そのためには、ミューテックス関数または協調型スレッドを使用できます。例えば、プリエンプティブなマルチタスク環境のティピカルケースでは、コンテナと共にミューテックス関数を使用するものになります。これは、次のことを意味します。
  • リーダスレッドは、読み出し中にスレッドが書き込まれない場合は、コンテナを安全に共有できます。
  • スレッドが共有コンテナに書き込まれる間は、コンテナの使用時にロック処理を適用する必要があります。
  • 書き込みスレッドは、別のコンテナに安全に書き込むことができます。
  • random_shuffle の使用時にロック処理を適用する必要があります。
  • マルチスレッドは、オブジェクトの使用時にロック処理を適用しない限り、iostream および locale クラスを安全に使用することができません。
関連する概念
1.19 再実装したミューテックス関数を確実に呼び出す方法
1.21 ARM C ライブラリでのスレッドセーフティ
関連する参考文書
1.20 マルチスレッド環境での ARM C ライブラリの使用
1.18 マルチスレッドアプリケーションにおけるロックの管理
関連情報
『ARM アーキテクチャ用 C++ ABI』の __cxa_* および __aeabi_* 関数
『ARM アーキテクチャ用例外処理 ABI』
Rogue Wave 標準 C++ ライブラリマニュアル
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.