相互排他ロック (mutex) は通常、データの集合と関連付けられ、そのデータへのアクセスを制御します。mutex は、ある時点で 1 つのスレッドのみがそのデータにアクセスできるようにする手段を提供します。mutex 関数には次のものがあります。
関連付けられたストレージを解放します。
mutex を取得します。
mutex を解放します。
mutex を初期化します。
mutex が現在のスレッドによって保持されているかどうかを評価します。ASSERT(9F) でのみ使用します。
利用可能な場合に mutex を取得しますが、ブロックはしません。
デバイスドライバは通常、ドライバデータ構造ごとに mutex を割り当てます。一般に mutex は、kmutex_t 型の構造体のフィールドです。使用する mutex を準備するために mutex_init(9F) が呼び出されます。この呼び出しは通常、デバイスごとの mutex については attach(9E) の時点で、グローバルドライバ mutex については _init(9E) の時点で行われます。
次に例を示します。
struct xxstate *xsp; /* ... */ mutex_init(&xsp->mu, NULL, MUTEX_DRIVER, NULL); /* ... */
mutex 初期化のより完全な例については、Chapter 6, Driver Autoconfigurationを参照してください。
ドライバはアンロードされる前に mutex_destroy(9F) を使用して mutex を破棄する必要があります。mutex の破棄は通常、デバイスごとの mutex については detach(9E) の時点で、グローバルドライバ mutex については _fini(9E) の時点で行われます。
共有データ構造を読み書きする必要があるドライバコードのすべてのセクションで、次のタスクを実行する必要があります。
mutex の取得
データへのアクセス
mutex の解放
mutex のスコープ、つまり mutex が保護するデータはすべてプログラマが管理します。mutex によってデータ構造が保護されるのは、データ構造にアクセスするすべてのコードパスが、mutex の保持中にデータにアクセスする場合に限られます。