1.20 マルチスレッド環境での ARM C ライブラリの使用

マルチスレッド環境で ARM C ライブラリを使用する前に、満たす必要のある多数の要件があります。

マルチスレッド環境で ARM C ライブラリを使用するには、以下を用意する必要があります。
  • スレッドごとに異なるメモリブロックを返すように動作する __user_perthread_libspace() の実装。これは、以下のいずれかの方法で実現できます。
    • 呼び出し元スレッドに応じて異なるアドレスを返す。
    • 固定アドレスに単一の __user_perthread_libspace ブロックを置いておき、スレッドの切り替え時にその内容を切り替える。
    使用する環境に合った方法を選択して下さい。
    特別な理由がない限り、__user_perproc_libspace() を再実装する必要はありません。大半のアプリケーションには、この関数の再実装が必要になるような要件は発生しません。
  • 複数のスタックの管理方法。
    複数のスタックの管理方法は、ARM の 2 領域メモリモデルを使用することで簡単に指定できます。この場合、プライマリスレッドに属するスタックを、ヒープから完全に分離しておく必要があります。その後、ヒープから分離された追加のスタックに対してさらにメモリを割り当てる必要があります。
  • スレッドを生成または破棄したり、スレッド同期を処理したり、終了コードを取得したりするためのスレッド管理関数。

    ARM C ライブラリには、独自のスレッド管理関数は用意されていないので、必要に応じてユーザが用意する必要があります。
  • スレッド切り替えメカニズム

    ARM C ライブラリには、独自のスレッド切り替えメカニズムは用意されていません。これは、このライブラリが、スレッド切り替えを行うさまざまな方法すべてに対応できるよう設計されているためです。
ミューテックスを実装する必要があるのは、ミューテックスを呼び出す必要がある場合のみです。
アプリケーションによっては、ミューテックス関数が意味をなさない場合があります。例えば、協調型スレッドのプログラムでは、重要セクションで明け渡し関数を呼び出さないようにすれば、データ整合性を維持するための対策は必要ありません。しかし、これに該当しないアプリケーションでは、例えばプリエンプティブスケジューリングを実装する場合や、SMP(対称型マルチプロセッサ)モデルを採用する場合には、これらの関数がロック処理で重要な役割を果たします。
以上の要件がすべて満たされる場合は、マルチスレッド環境で ARM C ライブラリを使用できます。以下の動作が適用されます。
  • 各スレッドで独立して動作する関数があります。
  • 自動的にミューテックス関数を使用して共有リソースへの複数アクセスを仲裁する関数があります。
  • まだ再入可能ではないが、再入可能な同等の関数を用意できる関数があります。
  • 再入不可能なままで、代替関数が存在しない関数も少数ですが存在します。
関連する概念
1.19 再実装したミューテックス関数を確実に呼び出す方法
1.21 ARM C ライブラリでのスレッドセーフティ
1.22 ARM C++ ライブラリでのスレッドセーフティ
1.11 ARM C ライブラリとマルチスレッド
関連する参考文書
1.18 マルチスレッドアプリケーションにおけるロックの管理
4.59 スレッドセーフな C ライブラリ関数
4.60 スレッドセーフではない C ライブラリ関数
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.