[英]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(秒)時,它不會出現段錯誤!
從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.