CRITICAL_ENTER(9) | FreeBSD Kernel Developer's Manual | CRITICAL_ENTER(9) |
名称
critical_enter, critical_exit — クリティカル領域に入って、出る書式
#include < sys/param.h>#include < sys/systm.h>
void
critical_enter( void);
void
critical_exit( void);
解説
これらの関数は、コードのクリティカル領域でプリエンプション (先取り) を防ぐために使用されます。現在 CPU で実行されるスレッドが先取りされないということが保証されるすべてです。厳密に言えば、クリティカル領域のスレッドはそれがクリティカル領域にある間、別の CPU に移動されません。現在の CPU はクリティカルセクションの間に、まだ欠陥と例外の引き金となっています。しかしながら、これらの欠陥は通常致命的です。critical_enter() と critical_exit() 関数は、入れ子にされたクリティカルセクションを取り扱うためにスレッド毎のカウンタを管理します。現在のスレッドがクリティカルセクションにある間に、通常、現在のスレッドをプリエンプト (先取り) するようにスレッドが実行可能にされるなら、現在のスレッドが最も外側のクリティカルセクションを終了するまで、プリエンプションは延期されます。
これらの関数がどんな相互 CPU 同期、データ保護、またはメモリ順序付け保証を提供する必要がなく、その結果、共有されたデータ構造を保護するのに使用されるべきで ない ことに注意してください。
これらの関数はクリティカル領域の中での無限ループが CPU をデッドロックするように注意して使用されるべきです。また、ミューテックス、sx ロック、セマフォ、または他の同期プリミティブでの操作をインタロックされるべきではありません。これへの 1 つの例外はスピン (spin) ミューテックスがクリティカルセクションを含んでいることであるので、ある場合には、クリティカルセクションはスピンミューテックスとインターロックされるかもしれません。
歴史
これらの関数は、 FreeBSD 5.0 で導入されました。October 5, 2005 | FreeBSD |