1

以下のC++コードの場合

volatile bool keepRunning = true;

void run() {
    while (keepRunning) {
        doSomeWork();
    }
}

void stop() {
    keepRunning = false;
}

1つのスレッドがstop()を実行し、複数のスレッドがrun()を実行しているとします。

この種の構成(1つのライター、同期プリミティブなし)は、組み込みシステムで非常に普及していると思います。複数のプロセッサ/コアがないと仮定すると、これは機能することが保証されていますか?

ありがとう

4

2 に答える 2

1

いいえ、メモリバリアはコードに課されていないため、コンパイラは揮発性アクセスを不揮発性アクセスで自由に並べ替えることができますが、これは不正な動作につながる可能性があります。「volatile」はマルチスレッドとはほとんど関係がありません。詳細については、Arch Robison のブログ投稿を参照してください。

また、これが単一の CPU プラットフォームであるか複数の CPU プラットフォームであるかは関係ありません。コードが正しい場合、store-with-release はキャッシュ コヒーレンシ プロトコルを介して他の CPU/スレッドに伝播し、すべて問題ありません。

于 2012-05-10T12:29:20.543 に答える
0

はい、ユニコア マシンには 1 つの CPU と 1 つの CPU キャッシュしかないためです。

別の理由: CPU には、実行中のスレッドが 1 つしかないように見えます。CPU は複数のスレッドがあることさえ認識できないため、シングルスレッドの実行と同等のメモリ ビューをアプリケーションに提示する必要があります。

于 2012-05-09T17:47:34.807 に答える