5

13 の機械語命令だけで完了する単純な決定論的な作業があります。最初の命令は自家製のセマフォ (スピンロック) を取得し、最後の命令はそれを解放するため、他のコアで実行されている他のすべてのスレッドが同じセマフォを取得および提供しようとしているのを防ぐことができます。

この問題は、スレッドが「クリティカル セクション」を終了する前に、セマフォを保持しているスレッドに割り込むと発生します。最悪の場合、セマフォを保持している間に割り込みによってスレッドが強制終了されるか、通常はセマフォをめぐって競合するスレッドの 1 つがコードに分岐し、割り込みを生成してデッドロックが発生する可能性があります。

私が制御できないコードの部分に分岐するときに、これらの他のスレッドと同期する方法がありません。カーネル モードで実行していた昔の VxWorks 時代に行っていたように、割り込みを無効にする必要があると思います。常に 13 の命令であり、割り込みを受け入れる前に 13 の命令すべてを完了できれば、私は常に完全に安全です。ああ、それはすべて私自身の内部データであり、自家製のセマフォが他のものをロックするものは何もないことを除いて.

私は近いと思ういくつかの答えを読みました。ほとんどの場合、Windows API でのクリティカル セクションの呼び出しに関係しています (OS は間違っていますが、概念は正しいかもしれません)。間違った解決策のほとんどは、pthread ライブラリで作成したミューテックスを使用して、問題のあるすべてのスレッドを取得できると想定しています。

Linux および Solaris 上の C/C++ でこのソリューションが必要です。

Johnny Crash の質問は非常に近いもの で、Linux スレッドがスケジューラによって中断されるのを防ぎます

KermitG また 、重要なコードで Linux ユーザー空間の pthread が生成されるのを防ぐことはできますか?

ご検討いただきありがとうございます。

4

1 に答える 1

5

ユーザー モード スレッドのプリエンプションを防ぐことはできません。クリティカル セクション (および他のすべての同期オブジェクト) は、スレッドの衝突を防ぎますが、OS によるプリエンプションを防ぐわけではありません。

他のスレッドがタイムアウト時に何かに分岐する場合、その何かがデッドロックにつながる可能性があります - 設計上の問題があります。

正しい設計は、最も悲観的である必要があります。プリエンプションは、不確定な時間でどこでも発生する可能性があります。

于 2012-04-09T21:18:55.157 に答える