1

これは私の最初のマルチスレッド実装なので、おそらく初心者の間違いです。スレッドは、ピクセルの2行ごとのレンダリングを処理します(したがって、すべてのレンダリングは各スレッド内で処理されます)。スレッドが画面の上部と下部をそれぞれレンダリングする場合、問題は解決しません。

両方のスレッドが同じ変数から読み取られますが、これにより問題が発生する可能性がありますか?私が理解したことから、書くことだけが並行性の問題を引き起こす可能性があります...

同じ関数を呼び出すと、同時実行の問題が発生する可能性がありますか?そして繰り返しますが、私が理解したことから、これは問題ではないはずです...

両方のスレッドが同じ変数に書き込むのは、計算されたピクセルカラーを保存するときだけです。これは配列に格納されますが、その配列の同じインデックスに書き込むことはありません。これは問題を引き起こす可能性がありますか?

マルチスレッドのレンダリングされた画像 (スパム防止により、画像を直接投稿できなくなります。)

追伸 どちらの場合もまったく同じ実装を使用します。唯一の違いは、レンダリング用に作成された1つのスレッドと2つのスレッドです。

4

2 に答える 2

6

両方のスレッドが同じ変数から読み取られますが、これにより問題が発生する可能性がありますか?私が理解したことから、書くことだけが並行性の問題を引き起こす可能性があります...

これは大丈夫です。明らかに、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ファミリプロセッサは、外部メモリサブシステムがスプリットアクセスをアトミックにすることを可能にするバス制御信号を提供します。ただし、整列されていないデータアクセスは、プロセッサのパフォーマンスに深刻な影響を与えるため、回避する必要があります。

于 2010-05-27T01:01:32.740 に答える
1

私は問題を解決しました。Stephenが提案したように、スレッドごとに個別にデータを構築することで解決しました(void *サイズではない要素)。非常に詳細な回答をありがとう!

于 2010-05-30T19:20:27.343 に答える