簡體   English   中英

glfwSleep()如何導致段錯誤?

[英]How can a glfwSleep() cause a segfault?

在我的多線程應用程序中,我正在使用sleep()函數(來自GLFW庫的函數):

glfwSleep(..);

它顯然引導我的應用程序進行segfaulting,因為我的調用堆棧顯示:

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

glfwSleep()用在一個線程中。 那危險嗎? 為什么我的程序會因此而產生分類錯誤?

編輯:

glfwSleep()的參數<0.02(秒)時,它不會出現段錯誤!

編輯2:

從GLFW的官方文檔:

在習慣之前編寫線程化應用程序可能會非常尷尬,但有一些關鍵規則很容易遵循:

  • 始終保證獨立訪問線程之間共享的數據!
  • 確保線程正確同步!
  • 永遠不要等待!

我想我得到了答案..現在找到另一種選擇..

謝謝!

來自GLFW維基

GLFW與GHC線程,forkIO或threadDelay不兼容。 如果可以,請避免使用它們。

segfault'ed線程是否與glfwSleep()調用者的線程相同?

似乎是由WaitForMultipleObjectsEx API調用引起的崩潰。 你指定並傳遞給WaitForMultipleObjectsEx正確的同步對象和數字嗎?

引用實用程序員

``選擇''沒有破碎

很難在操作系統或編譯器中找到錯誤,甚至是第三方產品或庫。 該錯誤最有可能在應用程序中。

glfwSleep()調用Sleep()時,為什么你的程序調用WaitForSingleObjectEx() Sleep() 好吧,即使你沒有Sleep()的源代碼,它也不是一個完整的黑盒子。 反匯編Sleep() ,你可能會看到(取決於你有哪個版本的Windows) Sleep()調用或尾調用SleepEx() 在XP上, SleepEx()調用NtDelayExecutionThread() ,在Vista上調用WaitForSingleObjectEx()

那么堆棧的其他部分發生了什么? 00000016,0000006C和00000000無效的返回地址。 如果你的代碼中的某個地方,你將指向堆棧分配的緩沖區的指針傳遞給另一個線程,並且當你的程序正在休眠時,我不會感到驚訝,那么其他線程會破壞第一個線程的堆棧。 進入Sleep() ,在返回地址上放置一個內存斷點,你可能能夠找到罪魁禍首。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM