2017-09-26 16 views
0

私はあるスレッドのテクスチャにレンダリングし、別のスレッドがこのテクスチャからデータを読み込むアプリケーションを持っています。 2つのスレッド間のコンテキストは共有されます。読み取りスレッドが部分的なデータを読み取る競合状態が発生する可能性はありますか?テクスチャを書き込んでいる間にテクスチャをレンダリングすることはできますか?

+3

はい、基本的にデータ競争のための完全な設定です。 –

+0

@DietrichEpp私は、何かが2つの異なるスレッドから文脈に書き込んでいるときに問題が発生する可能性があることをオンラインで読んでいましたが、 – Kyle

答えて

1

は、セクション5.3.1:

物体Tの内容は、セクション5.3に記載されるようなコマンドが完了したら変更されたと考えられます。コマンド1の完了は、Finishを呼び出すことによって、またはFenceSyncを呼び出して、関連付けられた同期オブジェクトに対してWaitSyncコマンドを実行することによって決定することができる。一般に

データ競合のときの動作:

  1. つ以上のスレッドがメモリ内の同じ場所に書き込む、およびスレッドの

  2. 少なくとも1つは

  3. スレッド間の同期はありません。

あなたはOpenGLで、あなたの操作が同期されていることを知って戻るFinish()またはWaitSync()を待ついずれかの必要があることがわかります。

ルール4対象Tの内容は現在のコンテキスト以外のコンテキストで変更された場合、少なくとも、Tが結合しなければならないか、に付きRE:追加ルール、ノートセクション5.3.3があります現在のコンテクスト内の1つのバインディングポイント、または現在バインドされているコンテナオブジェクトCの少なくとも1つのアタッチメントポイントを含むことができる。

あなたがスレッドAでテクスチャへの書き込み、およびスレッドBでそれから読み取るのであれば、次の操作を行う必要があります:

  1. は、同期オブジェクトを作成します。

  2. 書き込みが完了すると、スレッドAから同期オブジェクトに信号を送ります。

  3. スレッドBの同期オブジェクト待ち

  4. スレッドBにテクスチャを再バインド

これらの手順が完了したら、あなたはスレッドB.

ノートにテクスチャから読み取ることができます:あなたはそれをテストする場合は、データのレースでそのコードが「正常に動作」になるかもしれませんあなた自身のコンピュータ。これは驚くべきことではありません。時にはうまくいくことがあります。たぶんそれはあなたのコンピュータ上で動作し、他の誰かのコンピュータ上で爆破するでしょう。スレッド同期を使って物事を正しくする方が良い、テストだけでは十分ではありません。

1

可、はい、あります。

しかし、これは必ずしも必要ではありません。 GLsyncとglFinishで利用可能な細かい同期プリミティブがあり、それらを使用しない理由はありません。

データ競争の影響は正確には不明です。あなたはテクスチャの半分を読み終えるかもしれません、ドライバで致命的なエラーを引き起こすかもしれません、または単に停止するかもしれません。 the OpenGL 4.6 core specから

関連する問題