2

マルチスレッドまたはRTOS環境では、以下のこれらのコードは同一ですか?

そうではないと思います。しかし、最初のコードはマルチスレッド環境で絶対に保存されますか?コンパイラが「ga」にレジスタを割り当て、後でfunc_a()で「ga」を再度読み取らないようにするルールはありますか?

ロックを使用できることは知っていますが、これはデータを保護する方法についての質問ではありません。これは、コンパイラの動作に関する質問にすぎません。

//gaはグローバル変数です。

int func_a() {

    int a = ga;
    return a>2 ? a-2 : 2-a;
}

int func_b() {

    return ga>2 ? ga-2 : 2-ga;
}

私の意図は、gaを1回だけ読み取り、その値をローカル変数'a'に割り当てる標準的な方法(プラットフォーム固有ではない)を探しています。

「ga」が変更されたかどうかに関係なく、「a」を一貫して使用できます。

4

4 に答える 4

2

これらのバージョンのコードは両方とも、関数を実行する複数のスレッドに直面して未定義の動作をします。確かに、異なるコンパイラは、グローバル変数をレジスタに保存するかどうかに関して異なることを行うことができます。さらに、ローカル変数への割り当てが、グローバル変数を変更しているスレッドに関してアトミックな方法で実行できるという保証はありません。

于 2012-04-25T09:57:08.743 に答える
2

C 標準には、コンパイラがこれらの関数を異なる方法で実装することを要求する規則はありません。gaたとえば、レジ​​スタを操作する場合、コンパイラはtoからの代入を「最適化」する場合としない場合がありますa(つまり、「最適化」とは、REG にロードgaし、同じ REG を使用して残りの計算を行うことを意味します。としてa)。または、そうでない場合もあります。

ロックフリーのデータ構造を実装したい場合:

  1. C99 はあなたを助けることができる何も提供しません。
  2. C11 (ごく最近の標準) は、アトミック データ型を提供します。

C99 を使用している場合は、次のいずれかを行う必要があります。

  1. ロックを使用します (したがって、ロックフリー コードではありません)。
  2. アーキテクチャ固有のコードを書く準備をしてください。最低限行う必要があるのは、x86、x86_64、および ARM ISA によって提供されるアトミック操作を使用してロックフリーのデータ構造を実装するこのライブラリで行われているように、最小セットのアトミック操作を使用することです。

この回答の以前のバージョンでは、副次的な問題に触れました(これは に関係しており、実際のvolatile質問には関係ありません):

の実装方法に制限を加えることができるケースが 1 つありますがfunc_b、実際にはここで接線を引いてgavolatileます。

gaが volatile の場合、読み取りごとにメモリから新たにロードするga 必要があります。gaつまり in はfunc_bgaメモリから 2 回ロードされます。比較のために 1 回、戻り値を計算するために 1 回。予想される使用法は、たとえばga、メモリにマップされた I/O ポートを参照するとします。次に、2 つの読み取りの間に値がga変更された場合、これが戻り値に反映されます。ただし、別のスレッドで変更する場合はga、正常な/定義された動作を期待しないでください。

一方、修飾子がないからといって、 で が 1 回だけ読み取られるvolatileわけではありません。そして、「揮発性の反対」である修飾子はありません。gafunc_b

于 2012-04-25T10:21:35.117 に答える
0

2 つのスニペットは、最終的に同一のマシン コードになる可能性があります。マルチスレッドの場合、どちらも安全ではありません。

volatile一時変数の作成を強制しますが、「ga」から volatile 変数へのコピーはアトミックであることが保証されていないため、これはスレッドセーフではありません。

このようなコードを安全に書く唯一の方法は、ガードを使用することです。

int func_a() {

    mtx_lock(&ga_mutex);
    int a = ga;
    mtx_unlock(&ga_mutex);

    return a>2 ? a-2 : 2-a;
}
于 2012-04-25T10:55:59.247 に答える
0

動作は、使用しているコンパイラによって異なります。すべてのコンパイラには、最適化に関する独自のルールがあります。

于 2012-04-25T10:01:40.137 に答える