0

SMP環境で実行する必要のあるマルチスレッドアプリケーションがあり、複数のスレッドからシングル(またはワード長)バイトのグローバルメモリに書き込み(読み取り-変更-書き込みなし)しています。同期メカニズム(ミューテックス、セマフォ、スピンロック)を使用せずにこれを行うことはできますか?

私の推測では、CPUによるアラインされたメモリへのメモリの読み取り/書き込みはアトミックです。したがって、メモリへのアトミックアクセスのためにロックする必要はありません。

ただし、メモリの順序には問題があります。つまり、CPUに対するメモリの可視性の順序は、メモリへのアクセスと同じではない場合があります。これを解決するには、メモリバリア命令が必要です。ユーザースペースコードでメモリバリア命令を使用できますか?そうでない場合、メモリオーダリングの問題を解決するには、murtexまたはspinlockを使用する必要がありますか?

4

1 に答える 1

2

GCC__sync_synchronize()フルメモリバリアを実行するためのビルトインを提供します。

一部のアーキテクチャ(Alphaなど)は、ハードウェアレベルで読み取り/変更/書き込みサイクルを実行せずに1バイトを書き込むことができないことに注意してください。

于 2013-03-07T00:16:42.790 に答える