2.2.4. マルチスレッドアプリケーションにおけるロックの管理

スレッドセーフは、ロックを使用して同時アクセスから共有リソースを保護する機能です。 RVCT v2.2 以降では、このロックメカニズムを管理し、ヒープなどの共有データの破損を防ぐために再実装できる関数があります。 これらの関数は以下のプロトタイプを持っています。

_mutex_initialize()

32 ビットワードを指定するポインタを受け入れ、有効な相互排除関数として初期化します。

int _mutex_initialize(mutex *m);

非スレッドアプリケーションの場合、_mutex_initialize() はデフォルトで 0 を返します。 したがって、マルチスレッドアプリケーションの場合、_mutex_initialize() は、成功時に 0 以外の値を返す必要があります。その結果、実行時に、この関数がマルチスレッド環境で使用されていることがライブラリによって認識されます。

_mutex_acquire()

この関数を呼び出したスレッドは、指定された相互排除関数のロックを取得します。

void _mutex_acquire(mutex *m);

相互排除関数に所有者がいない場合、_mutex_acquire() は即座に戻ります。 別のスレッドが相互排除関数を所有している場合、_mutex_acquire() は、この関数が利用可能になるまでブロックします。

_mutex_release()

この関数を呼び出したスレッドは、指定された相互排除関数を解放します。

void _mutex_release(mutex *m);

_mutex_release() は、別の呼び出し元スレッドが相互排除関数を所有していると想定します。

C ライブラリの場合、相互排除関数は、いずれの場所にも配置が可能な 1 つの 32 ビットワードのメモリとして指定されます。 ただし、相互排除関数の実装がこれを上回るメモリを必要とした場合、または相互排除関数を特殊なメモリに保存しなければならない場合には、実際の相互排除関数を指すポインタとしてデフォルトの相互排除関数を処理する必要があります。

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential