1

私のマルチスレッド アプリケーションでは、sleep() 関数 (GLFW ライブラリのもの) を使用しています。

glfwSleep(..);

私のコールスタックが示すように、それは明らかに私のアプリケーションをセグメンテーション違反に導きます:

#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)

glfwSleep()スレッド内で使用されます。それは危険ですか?その結果、プログラムがセグメンテーション違反になるのはなぜですか?

編集:

のパラメータglfwSleep()が < 0.02 (秒) の場合、segfault は発生しません!

編集2:

GLFW の公式ドキュメントから:

スレッド化されたアプリケーションの作成は、慣れるまでは非常に厄介かもしれませんが、いくつかの重要なルールに従うのは非常に簡単です。

  • スレッド間で共有されるデータへの排他的アクセスを常に保証してください!
  • スレッドが適切に同期されていることを確認してください!
  • 決して忙しく待つことはありません!

私は答えを得たと思います..今すぐ代替案を見つけなければなりません..

ありがとう!

4

3 に答える 3

2

GLFWウィキから:

GLFW は、GHC スレッド、forkIO、または threadDelay ではうまく機能しません。したがって、可能であればそれらを避けてください。

于 2009-05-23T23:22:20.557 に答える
1

実用的なプログラマーを引用するには、

「選択」は壊れていません

OSやコンパイラ、さらにはサードパーティの製品やライブラリにバグが見つかることはめったにありません。バグはアプリケーションにある可能性が最も高いです。

呼び出しWaitForSingleObjectEx()時にプログラムが呼び出されるのはなぜですか?さて、あなたがソースコードを持っていなくても、それは完全にブラックボックスではありません。分解すると、(使用しているWindowsのバージョンに応じて)呼び出しまたは末尾呼び出しのいずれかが表示される可能性があります。XPでは、を呼び出し、Vistaでは。を呼び出します。glfwSleep()Sleep()Sleep()Sleep()Sleep()SleepEx()SleepEx()NtDelayExecutionThread()WaitForSingleObjectEx()

では、スタックの残りの部分はどうなりましたか?00000016、0000006C、および00000000は有効な差出人住所ではありません。コードのどこかで、スタックに割り当てられたバッファーへのポインターを別のスレッドに渡し、プログラムがスリープしているときに、その別のスレッドが最初のスレッドのスタックを破損しても、驚かないでしょう。に足を踏み入れSleep()、差出人住所にメモリブレークポイントを設定すると、犯人を捕まえることができる場合があります。

于 2009-05-24T16:57:02.337 に答える
1

segfault されたスレッドは glfwSleep() の呼び出し元のスレッドと同じですか?

WaitForMultipleObjectsEx API の呼び出しによるクラッシュのようです。WaitForMultipleObjectsEx に正しい同期オブジェクトと番号を指定して渡しますか?

于 2009-05-23T23:28:22.823 に答える