2

wait_event_timeout指定された時間、または何らかの条件が真になるまで、スレッドをスリープ状態にするために使用できます。
この条件が共有変数である状況に直面しています。

ret = wait_event_timeout(SLEEP_Q,shared_vaible == 1,TIME_TO_SLEEP);

spinlockこれを呼び出す前に、共有変数へのアクセスに使用する を手放す必要があります。

だから私の質問は、共有変数がロックを使用せずに読み取られるため、正確性が損なわれることですか?
カーネルは、wait_eventインターフェイスのそのような条件に競合条件がないことを保証しますか?

4

1 に答える 1

3

変数がアトミックに更新できるほど小さい場合、およびすべての更新が実際にアトミックに行われる場合 (のようなものACCESS_ONCE(shared_variable) = 1;)、質問のコードを使用できます。

それ以外の場合は、変数の読み取り中にロックを取得する必要があります。これを行う最善の方法は、単純なヘルパー関数を作成することです。

ret = wait_event_timeout(SLEEP_Q, read_shared_variable() == 1, TIME_TO_SLEEP);
于 2013-05-24T07:24:15.540 に答える