C++ glfwSleep()如何导致SEGFULT?
在我的多线程应用程序中,我使用了sleep()函数(GLFW库中的函数): 这显然会导致我的应用程序出现segfaulting,正如我的调用堆栈所示:C++ glfwSleep()如何导致SEGFULT?,c++,c,segmentation-fault,sleep,glfw,C++,C,Segmentation Fault,Sleep,Glfw,在我的多线程应用程序中,我使用了sleep()函数(GLFW库中的函数): 这显然会导致我的应用程序出现segfaulting,正如我的调用堆栈所示: #0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??) #1 00000016 ??() (??:??) #2 0000006C ??() (??:??) #3 00000000 ??() (??:??) glfwSleep()用于线程内部。那危险吗?为
#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)
glfwSleep()
用于线程内部。那危险吗?为什么我的程序会因此而出错
编辑:
当glfwSleep()
的参数<0.02(秒)时,它不会出现故障
编辑2:
根据GLFW的官方文件:
编写线程化应用程序可能很困难
还没习惯就很尴尬
但有几个关键规则
以下内容相当简单:
- 始终确保以独占方式访问线程之间共享的数据李>
- 确保线程正确同步李>
- 永远不要忙着等待强>
segfault线程是否与glfwSleep()调用方的线程相同 看来崩溃是由调用WaitForMultipleObjectsEx API引起的。
您是否指定并将正确的同步对象和数字传递给WaitForMultipleObjectsEx?分段线程是否与glfwSleep()的调用者的线程相同 看来崩溃是由调用WaitForMultipleObjectsEx API引起的。 您是否指定并将正确的同步对象和数字传递给WaitForMultipleObjectsEx?引用 “选择”未被破坏 难得 在操作系统或编译器中发现错误, 甚至是第三方产品或 图书馆。该bug最有可能出现在 应用程序 当
glfwSleep()
调用Sleep()
时,为什么程序调用WaitForSingleObjectEx()
?嗯,即使您没有Sleep()
的源代码,它也不完全是一个黑盒子。分解Sleep()
,您可能会看到(取决于您使用的Windows版本)调用或尾部调用SleepEx()
。在XP上,SleepEx()
调用NtDelayExecutionThread()
,在Vista上调用WaitForSingleObjectEx()
那么你剩下的那一堆呢?00000016、0000006C和00000000不是有效的返回地址。如果在代码中的某个地方,您将指向堆栈分配缓冲区的指针传递给另一个线程,并且当您的程序处于睡眠状态时,另一个线程会损坏第一个线程的堆栈,我也不会感到惊讶。进入Sleep()
,在返回地址上放置一个内存断点,您可能就能抓住罪犯。引用
“选择”未被破坏
难得
在操作系统或编译器中发现错误,
甚至是第三方产品或
图书馆。该bug最有可能出现在
应用程序
当glfwSleep()
调用Sleep()
时,为什么程序调用WaitForSingleObjectEx()
?嗯,即使您没有Sleep()
的源代码,它也不完全是一个黑盒子。分解Sleep()
,您可能会看到(取决于您使用的Windows版本)调用或尾部调用SleepEx()
。在XP上,SleepEx()
调用NtDelayExecutionThread()
,在Vista上调用WaitForSingleObjectEx()
那么你剩下的那一堆呢?00000016、0000006C和00000000不是有效的返回地址。如果在代码中的某个地方,您将指向堆栈分配缓冲区的指针传递给另一个线程,并且当您的程序处于睡眠状态时,另一个线程会损坏第一个线程的堆栈,我也不会感到惊讶。进入
Sleep()
,在返回地址上放置一个内存断点,您可能就能抓住罪犯。hmm谢谢!我试图通过创建一个显示10000个整数的函数来模拟延迟,但这里也出现了一个segfault:(Amokrane:Segfaults通常是由于对指针做了一些不适当的操作而导致的。看看在仍然存在Segfaults的情况下,您可以缩小程序的大小。如果您有一个小规模的程序仍然存在问题,您可以随时发布另一个问题。嗯,谢谢!我试图通过创建一个函数来模拟延迟。)at显示10000个整数,但我这里也有一个SEGFULT:(Amokrane:Segfaults通常是由于对指针做了一些不适当的操作而导致的。看看在仍然存在Segfaults的情况下,您可以缩减程序多少。如果您有一个小规模的程序仍然导致问题,您可以随时发布另一个问题。1/是的。2/不理解这个问题?我只是在做一个:glfw。)Sleep(0.5);请注意,在0.02下它没有segfault!我检查了GLFW的源代码树。在windows中,glfwSleep从不调用WaitForMultipleObjectsEx,而是调用Sleep。(请参阅:)使用WaitForMultipleObjectsEx API检查源代码。1/是。2/不明白这个问题?我只是在做一个:glfwSleep(0.5);请注意,在0.02下它不segfault!我检查了GLFW的源代码树。在windows中,glfwSleep从不调用WaitForMultipleObjectsEx,而是调用Sleep。(请参阅:)使用WaitForMultipleObjectsEx API检查源代码。
#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)