日々の業務で排他処理を組み込む事も多くあると思いますが、その際に、OSがどういう挙動をするのかを意識しておいた方が良いケースがあるのでご紹介します。
複数のタスクが、Mutexを使って排他をかけて、共有メモリ領域に書き込みをするというような、処理です。
図のようにタスクAが先にMutexを取得するので、タスクBは、タスクAがMutexを解放するまで処理を待ちます。
ここで気を付けた方がよいこととして、タスクAは、タスクBより優先度が低いタスクになります。
そのため、OSによっては、自分より優先度の高いタスクがMutexを取得しに来ると、自身の優先度が変わるケースがあります。
図の吹き出しに記載しているように、Mutexを取得しに来たタスクの優先度まで引き上げられたり、一定の優先度まで引き上げられたりなどが考えられます。
Mutexを取得しに来たタスクの優先度まで自身の優先度が上がるようなケースで例えば、次のような処理を作ってしまうと、デッドロックしてしまいます。
処理としては、タスクA,BがMutexを取得するのは同じですが、タスクAには、タスクCのフラグセットを待つ処理が入っています。
しかし、タスクAは、タスクBまで優先度が上がっているため、タスクCはフラグをセットできず、タスクAは、フラグのセットを待ち続けるという状況になってしまいます。
排他処理を行うときに、ご自身の使っているOSがどういう挙動をするのかを意識しながら、組み込んでいくことで、デッドロックを防ぐことができると思います。
以上、お読み頂きありがとうございました。