1

したがって、これは非常に特殊な質問です。

シングル CPU コアの組み込みシステムを使用しています。

1 つのメイン スレッドと 1 つの割り込みがあります。これらは 32 ビットの float を共有します。割り込みがフロートを書き込み、メインスレッドがそれを読み取ります。読み取りと書き込みは同期されません。

プロセッサのドキュメントには、32 ビットの読み取りは 1 サイクルの操作であると記載されています。

メインスレッドが破損した値を読み取るリスクがないという私の評価は正しいですか? それとも他の要因がありますか?

4

5 に答える 5

2

読み取りと書き込みの両方がアトミック操作である限り、問題ありません。読み取りまたは書き込みにかかる時間は重要ではありませんが、1 サイクルであれば原子的である可能性が高いようです。

于 2009-10-08T20:28:44.673 に答える
1

あなたは安全だと私には思えます。読み取りが一度に行われると、バイトの半分だけに書き込むことはできません。そうは言っても、コンパイラによって最適化されるのではなく、値が常に実際にスレッドによって読み取られるようにする必要があります。これは、誰も外部から変数を変更できないとコンパイラが判断した場合に発生する可能性があります。volatile として宣言するとうまくいくはずです(該当する場合-私はあなたのコードに精通していません)。

于 2009-10-08T20:36:29.883 に答える
0

割り込みルーチンが値を読み取らず、その値を使用して新しい値を計算して書き込む限り、問題ないと思います。

ドキュメントには、書き込みに 1 サイクルかかると記載されていますか? そうでない場合は、保護が必要です。

于 2009-10-08T20:32:25.617 に答える
0

安全である必要があります-そうでないと思われる場合は、値を読み取る前に割り込みを無効にし、読み取り後に有効にすることができます。しかし、私はあなたが元気であることを確信しています -

于 2009-10-08T20:34:07.203 に答える
0

操作をスレッドセーフにするための考慮事項は、アトミック読み取り/書き込みだけではありません。答えは、OS のメモリ モデルにも依存すると思います。メインスレッドでの読み取りが、割り込みによって書き込まれた最新の値を取得することを確認する必要があります。

于 2009-10-08T20:34:08.390 に答える