2016-05-26 14 views
1

複数のスレッドが単一のソースから一定の読み込みを行っている状況で、スレッドの安全性と未定義の動作について懸念すべき点は何ですか?スレッドの安全性:単一のconstソースから複数のスレッドを読み取る

私は独立したプロセスの並列実行を可能にする信号処理モデルに取り組んでいます。これらのプロセスは入力バッファを共有するかもしれませんが、入力バッファを満たすプロセスは常に完了します。実行する。

この状況でスレッドの安全性の問題について心配する必要はありますか?それについて私は何ができますか?

私は可能

+1

「const」はスレッドセーフであり、標準ライブラリはこのように動作します。ユーザー定義型では、同じ方法で動作する必要がありますが、それらは適切に実装する必要があります。私は標準的な参照を見つけることを試みる。 –

答えて

2

しかしおそらく並列プロセスの次の段階は

これが保証されている場合、複数の異なるスレッドから読み出し有する問題がないを実行する前に入力バッファを充填する工程は、常に完全であろうconstオブジェクトの場合

次はn4296からであるので、私は、公式の標準を持っていない:

17.6.5.9データ競合回避

A C++標準ライブラリ関数ではない、直接または間接的になりません現在のスレッド以外のスレッド によってアクセス可能なオブジェクト(1.10)を変更します。ただし、このオブジェクトには、関数の非const 引数を介して直接的または間接的にアクセスする必要があります。

[注意:これは、例えば、それも明示的にスレッド間でオブジェクト を共有していないプログラムでデータ競合を引き起こす可能性があるため、実装が 同期せずに内部目的のために静的オブジェクトを使用することはできません。末端ノート]


ここでは、私が最初にC++ 11標準でconstの意味について学んだHerb Sutter videoです。 (約7:00〜10:30を参照)

1

いいえ、あなたがOKであれば、ロックフリーのソリューションが最善だろうことに注意したいと思います。同じ定数ソースからの複数の読み込みはOKで、私が知っているすべてのスレッドモデル(つまり、PosixとWindows)ではリスクはありません。

ただし、入力バッファを埋め

が、プロセスは常に保証はここで何している

完全なものでしょうか?あなたは本当にこれが事実であることをどのように知っていますか?同期していますか?

+0

一連のプロセスが複数の段階に分割されています。ステージは、システムがシングルスレッドであるように実行されます。並列処理はステージ内でのみ実行でき、システムは各ステージが完了するまで待ってから、現在のステージに依存する別のステージが実行されます。 –

+0

@AlexZywicki、悪魔は詳細です。システムは待っています**何**? – SergeyA

+0

それは確かに問題です、私は現時点では、私が起こそうとする望ましい行動であると思います。私はstd :: future/promiseを使ったり、std :: atomic_boolを条件変数に使って議論していました。私はまだデザインアイデアで遊んでいます –

関連する問題