我得到线程睡眠错误在c++ 11线程

i get thread sleep error in C++11 threading

本文关键字:线程 c++ 错误      更新时间:2023-10-16

我使用c++ 11 thread类创建了一个线程,我希望线程在循环中睡眠。
this_thread::sleep_for()函数被调用,我得到异常说:

运行时检查失败#2 -围绕变量'_Now'的堆栈是损坏。

我的代码如下:

std::chrono::milliseconds duration( 5000 );
while (m_connected)
{
    this->CheckConnection();
    std::this_thread::sleep_for(duration);
}

我假定_Nowsleep_for实现深处某处的局部变量。如果它损坏了,要么是该函数有bug(不太可能),要么是应用程序的其他部分正在写入悬空指针(更有可能)。

最可能的原因是,在调用sleep_for之前的一段时间,你给出了一个指向本地变量的指针,该指针留在周围,并且在该线程休眠时由其他线程写入。

如果你在Linux上,我建议你尝试valgrind(虽然我不确定它可以捕获对堆栈的无效访问),但在Windows上,我不知道有什么工具可以调试这种问题。你可以做仔细的检查,你可以尝试禁用功能的各个部分,看看问题什么时候消失,以缩小问题的范围。

我也曾经使用过duma库,并取得了一些成功,但它只能捕获对堆的无效访问,而不是堆栈。

注意:clang和gcc在实现c++ 11方面都比msvc++更进一步,所以如果你不使用太多windows特定的东西,可能很容易移植并尝试valgrind。与msvc++相比,Gcc,尤其是clang提供了更好的静态诊断,因此,如果您使用Gcc或clagn编译它,您可能会得到一些警告,指出问题所在。