C++ glfwSleep()如何导致SEGFULT?

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()用于线程内部。那危险吗?为

在我的多线程应用程序中,我使用了sleep()函数(GLFW库中的函数):

这显然会导致我的应用程序出现segfaulting,正如我的调用堆栈所示:

#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)
glfwSleep()
用于线程内部。那危险吗?为什么我的程序会因此而出错

编辑: 当
glfwSleep()
的参数<0.02(秒)时,它不会出现故障

编辑2: 根据GLFW的官方文件:

编写线程化应用程序可能很困难 还没习惯就很尴尬 但有几个关键规则 以下内容相当简单:

  • 始终确保以独占方式访问线程之间共享的数据
  • 确保线程正确同步
  • 永远不要忙着等待
我想我得到了我的答案。我现在必须找到一个替代方案

谢谢

来自:

GLFW与GHC的配合不好 线程、forkIO或threadDelay。所以 尽可能避免它们

发件人:

GLFW与GHC的配合不好 线程、forkIO或threadDelay。所以 尽可能避免它们


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 ??() (??:??)