2017-01-17 10 views
1

http://en.cppreference.com/w/cpp/container#Thread_safetyによれば、異なるスレッドからstd::vectorの異なる要素に書き込むことは安全です。同時のstd :: vector書き込みの効率

しかしvalue_typeはCPUのワードサイズ(またはhardware destructive interference size)よりも小さい場合、(std::vector<char>)のように、これは、要素へのアクセスが、それは、スレッドの安全性を必要とせずに可能性よりも効率的であることを意味するのでしょうか?

たとえば、読み取り/書き込みアクセスはメモリフェンス/アトミック命令を意味しますか?

+0

同じ要素への同時書き込みがないことを保証するのはプログラマの責任です。この標準では、何かを支援することを義務づけていません(例えば、原子性の保証はありません)。プログラマが責任を果たしたら、それだけで安全です。彼女がしなければ、それは安全ではない。 –

答えて

2

はい、それは、標準的な、安全ですそれが安全であることが必要です。しかし、それは「偽の共有」と呼ばれるもののために非効率的かもしれません。

個々のスレッドが同じキャッシュラインに属する隣接メモリを更新すると、偽の共有が発生します。これらのスレッドが2つの異なるコア上で実行されると、両方のCPUのキャッシュラインが無効になり、高価なキャッシュ更新が発生します。

コードライターは、同じスレッドに近いインデックスを割り当てようとすることによって、誤った共有を少なくするために妥当な努力をする必要があります。

質問に答えるには、私はちょうど元の投稿に見ました。いいえ、このような書き込みにはコンパイラによって生成されたフェンスはありません。

+0

偽の共有は非効率を引​​き起こしますが、それはコンテナのスレッド安全要件によって引き起こされるものですか? – user2079303

+0

@ user2079303、わからないのかどうかわかりません。標準では、ベクトルの2つの異なる要素への並列書き込みがスレッドセーフである必要がありますが、CPUキャッシュについては何も知られていません。 – SergeyA

+0

私の指摘は、「スレッドの安全要件によって要素のアクセスが効率的になりませんか」という質問があります。偽の共有は要素アクセスを(それが当てはまる場合は)効率が悪くなりますが、それがスレッドの安全要件によって引き起こされない場合、それは本当に質問に答えません。 – user2079303

0

C++の準拠した実装では、「書き込みの発明」なしでcharの値に書き込むことができなければなりません。言い換えれば、charは、少なくとも孤立書き込みに必要なマシンと同じくらい大きくなければなりません。

(それはまだによる階層メモリにおける干渉への複数のスレッドから、隣接するメモリ位置に書き込む非効率であってもよく、それは誤っではない。)

+0

標準では 'sizeof(char)== 1 'が必要です – tmlen

+2

@tmlen:はい。そう? –

+0

しかし、ローカル変数の代わりに 'std :: vector'の要素を扱うとき、ベクトルの部分をCPUキャッシュに保持せず、読み書きを' std :: atomic 'と' memory_order_seq_cst '? – tmlen

関連する問題