両方のスレッドが同じ変数から読み取られますが、これにより問題が発生する可能性がありますか?私が理解したことから、書くことだけが並行性の問題を引き起こす可能性があります...
これは大丈夫です。明らかに、2つのスレッドが読み取りを開始する前にデータが初期化され、両方のスレッドが終了した後に破棄される限り。
同じ関数を呼び出すと、同時実行の問題が発生する可能性がありますか?そして繰り返しますが、私が理解したことから、これは問題ではないはずです...
はいといいえ。コードなしではわかりにくい。関数は何をしますか?static
共有状態(変数、グローバル変数、シングルトンなど)に依存していますか?はいの場合、これは間違いなく問題です。共有状態がまったくない場合は、問題ありません。
両方のスレッドが同じ変数に書き込むのは、計算されたピクセルカラーを保存するときだけです。これは配列に格納されますが、その配列の同じインデックスに書き込むことはありません。これは問題を引き起こす可能性がありますか?
たぶん時々。何の配列?の場合はおそらく安全ですsizeof(element) == sizeof(void*)
が、C ++標準はマルチスレッドではミュートであるため、コンパイラがハードウェアにこれを安全にするように強制することはありません。プラットフォームがここであなたを噛んでいる可能性があります(たとえば、64ビットマシンと1つのスレッドが32ビットを書き込み、隣接する32ビット値を上書きする可能性があります)が、これは珍しいパターンではありません。通常は、確実に同期を使用することをお勧めします。
これは、いくつかの方法で解決できます。
- 各スレッドは独自のデータを作成し、完了すると集計されます。
- ミューテックスを使用して共有データを保護できます。
私の答えにコミットメントがないことが、マルチスレッドプログラミングを難しくしているのです:P
たとえば、インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルから、さまざまなプラットフォームがさまざまなレベルのアトミック性を保証する方法について説明しています。
7.1.1保証された不可分操作
Intel486プロセッサ(およびそれ以降の新しいプロセッサ)は、次の基本的なメモリ操作が常にアトミックに実行されることを保証します。
- バイトの読み取りまたは書き込み
- 16ビット境界に揃えられた単語の読み取りまたは書き込み
- 32ビット境界に整列されたダブルワードの読み取りまたは書き込み
Pentiumプロセッサ(およびそれ以降の新しいプロセッサ)は、次の追加のメモリ操作が常にアトミックに実行されることを保証します。
- 64ビット境界に整列されたクアッドワードの読み取りまたは書き込み
- 32ビットデータバス内に収まるキャッシュされていないメモリ位置への16ビットアクセス
P6ファミリプロセッサ(およびそれ以降の新しいプロセッサ)は、次の追加のメモリ操作が常にアトミックに実行されることを保証します。
- キャッシュライン内に収まるキャッシュメモリへのアラインされていない16、32、および64ビットアクセス
バス幅、キャッシュライン、ページ境界に分割されたキャッシュ可能なメモリへのアクセスは、Intel Core 2 Duo、Intel Atom、Intel Core Duo、Pentium M、Pentium 4、Intel Xeon、P6ファミリ、Pentiumによってアトミックであることが保証されていません。 、およびIntel486プロセッサ。Intel Core 2 Duo、Intel Atom、Intel Core Duo、Pentium M、Pentium 4、Intel Xeon、およびP6ファミリプロセッサは、外部メモリサブシステムがスプリットアクセスをアトミックにすることを可能にするバス制御信号を提供します。ただし、整列されていないデータアクセスは、プロセッサのパフォーマンスに深刻な影響を与えるため、回避する必要があります。