1

したがって、スレッドがミューテックスをロックしてから hrtimer を開始するとします。タイマー ハンドラのコールバック関数で、そのミューテックスのロックを解除できますか?

この質問は、mutex.h ファイルで見たものです。「ミューテックスのロックを解除できるのは所有者だけです」「ミューテックスが保持されているとタスクが終了しない可能性があります」「ミューテックスは、タスクレットやタイマーなどのハードウェアまたはソフトウェアの割り込みコンテキストでは使用できない可能性があります」

では、タイマー ハンドラは割り込みコンテキストで実行されるのでしょうか。そのコンテキストでは、所有者がわからないため、ミューテックスのロックを解除できませんか? だから多分私はセマフォを使うべきですか?

ありがとう、


@Andy Ross こんにちは、返信ありがとうございます。コメントにあまりにも多くの単語を入力することはできません。私がやろうとしていることは、説明するのが少し難しいです。たとえば、1 つのソケットに 4 つのコアがあります。コア 0 はその周波数を上げたいと考えています。これを行うには、まずソケット電圧を上げて (電圧変化はソケット レベル)、次に周波数を変更する必要があります。変更プロセス中 (通常、電圧の変更には時間がかかります)、他のコアもソケットの電圧を変更する必要がある場合がありますが、これは許可されるべきではありません。したがって、コア 0 は最初にミューテックスをロックし、次に電圧コマンドの変更を発行し、タイマーを開始し、すぐに他のタスクを実行するために戻ります。タイマーが切れると、電圧変更が終了したかどうかを確認します。その場合、コアの周波数を変更し、ミューテックスのロックを解除して、他のコアがソケットの電圧を変更できるようにします。したがって、ミューテックスはソケットレベルです。たぶん、睡眠を使うことができると思います。電圧の変更が完了する前に他のコアが電圧を変更しようとすると、たとえば nanosleep() が実行されます。

4

1 に答える 1

2

答えはノーだ。タイマーは別のスレッドで実行されます。ロックを解除できるのは同じスレッドのみです。

あなたの問題については、状態フラグ/カウントを使用してatomic_set、友達と更新する必要があります。そのフラグを使用してステータスを識別し、ミューテックスをそれほど長く保持しないでください。

電圧変更要求をキューに入れる必要がある場合は、キューを使用します。長い間プロセスをブロックすることは決して賢明な考えではありません。

于 2012-10-03T03:27:56.070 に答える