ミューテックスのロックは、オペレーティング・システム・ソリューションによって与えられた特別な命令にハードウェアの一部の上に構築されています。
シニアは、実際にtest_and_setとcompare_and_swapや他の命令を呼び出します。もちろん、ここでのテストと設定と比較して、スワップ命令は、特定のプラットフォームでの命令の2種類のちょうど抽象的な定義は実装されていません。
あなたは、テストとセットに慣れていない場合は、テストおよび命令セットは、次のような定義されています
bool tas(bool *target){
bool rv = *target;
*target = true;
return rv
}
もちろん、これは唯一の定義であり、全体のコマンドは、コマンドのように原子です。
相互排他は次のようになり達成するために、テストおよび設定コマンドを使用します。
do{
while(tas(&lock))
;
/*critical section*/
lock = false;
/*remainder section*/
}while(true);
ロック(TAS(&ロック))ときながら、当初は最初の文の実装、その後、falseに初期化されている
二つのことが起こる、最初の文は、それ自体が結果であるが、このようにダウンし、次の実行にスレッドを許可するfalseで、クリティカルセクション第2文は真のロックに割り当てられます。
(TAS(&ロック))間に、第2のスレッドが最初の文を実行する場合、ロックは、真の値をとるとき、それは無限ループビジーウェイトになります。最初のスレッドロックをfalseに設定するまでは、クリティカルセクションを入力することはできません。その時に最初のスレッドがクリティカル領域を残して、相互に排他的な効果に達しています。
次のようにcompare_and_swap命令が定義されています。
int cas(int *val, int exp, int new_val){
int tmp = *val;
if(*val = exp)
*val = new_val;
return tmp;
}
専用のCASコマンド:
lock = 0;
do{
while(cas(&lock,0,1) != 0 )
;
lock = 0;
}while(true);
コマンドは、分析が難しいことではありませんCAS。
二つ以上のオペレーティング・システムは、ハードウェアソリューションを提供しています。しかし、それは、ユーザプログラムのコンパイルは、一般的に発達していないのは残念です。pthreadのに非常に似て、窓は、ソフトウェアのソリューションを提供します。
最も直接的なアイデアは、ミューテックスロックです:クリティカル領域に入る前にロックを取得する必要があり、他のスレッドがロックを取得するように、重要な領域は、ロックを解放する必要があります残して、他のスレッドがクリティカルセクションに入ることができないロックされません。
次のように---得られるロック動作の2つの解放に定義されます。
acquire(){
while(!available)
;
available = false;
}
release(){
available = true;
}
なお、取得し、すべての原子のリリース。
取得の定義を参照してください既視感の波を感じた時ではないでしょうか?我々は偽から真になるロックし、一方でリコールTASは、二つの動作の最初の文を実行したときに、私たちは
アイドルループが実行されていない状態となるよう命令は、falseを返しますTAS。
ここでは、真のデフォルトで使用可能、アイドルループが実行されない一方で、我々は真から利用可能になるように、偽となります。
ロックとして(!利用可能)、我々はそれが=利用可能falseです=真の固定ロックを、TAS知っている。
ここではTASと、それは取得を実現します:
/*初始化lock = false*/
while(tas(&lock))
;
TAS(&ロック)falseを返し、ロック=真妨げる他のプロセスがクリティカル領域に入る一方で、重要な領域に入ります。
しかし、TASコマンドのみを実現することができるので、ロック=真、偽=利用可能であるので、我々は、我々は、コマンドCASを使用することができ、放出を達成するために、この時間は、それを使用することはできません
次のようにリリースが実現します:
cas(&lock, false, true);
ロック= falseのとき、私たちは真に彼を変更します。
だから我々は今、TSLとミューテックスロックを持っています。
ます。https://www.jianshu.com/p/4d8e56461f7bで再現