0

JUCE ベースのマルチスレッド OpenGL アプリケーションの 3 つのインスタンスを 1 台のマシンで実行しています。各インスタンスは個別の X ディスプレイに接続されています。メイン アプリケーション スレッドの呼び出しXInitThreadsに続いXOpenDisplayて、適切なディスプレイが呼び出されます。次に、メインのレンダリング ループに別のスレッドが使用されます。アプリケーションの 3 つのインスタンスは、次の起動時に 1 つのグラフィック設定が終了するように、互いに初期化されます。

80% のケースですべてが正常に起動しますが、アプリケーションの 2 番目または 3 番目のインスタンスで 4 番目の呼び出しglXMakeCurrent(これは、接続が初期化されたスレッドとは異なるスレッドから行われた最初の呼び出しでもあります) で発生することがあります。二度と戻りません。glXMakeCurrentX スレッドは初期化されており、スレッドはロックを使用しており、X ディスプレイへの呼び出しの直前にロックされてXLockDisplayいます (呼び出しが返された後にロック解除されます)。

各アプリケーションが正しい表示とコンテキストを使用していることを確認しました。複数のスレッドが同じディスプレイ接続にアクセスするという問題に純粋に関連している場合、最初のインスタンスでこの問題が発生する可能性は同じですが、発生することはありません。

glXMakeCurrentX ディスプレイに排他的にアクセスできるにもかかわらず、なぜ戻ってこないのでしょうか?

4

1 に答える 1

0

実際、私は間違っていました。この問題は、JUCEOpenGLコンテキストのロックが欠落していることが原因であると思われます。したがって、Xディスプレイロックは正しく取得されましたが、マップされるはずのコンテキストが(問題の場合)他のスレッドによって同時にアクセスされ、glXMakeCurrentデッドロックが発生していました。

于 2012-05-03T08:31:24.087 に答える