我在C ++ 11线程中遇到线程休眠错误

时间:2013-06-13 06:44:13

标签: c++ windows multithreading visual-studio-2012 c++11

我使用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);
}

1 个答案:

答案 0 :(得分:0)

我认为_Nowsleep_for实施深处的局部变量。如果它被破坏,那么该函数中存在错误(不太可能)或者应用程序的某些其他部分正在写入悬空指针(更有可能)。

最可能的原因是,在调用sleep_for之前的某个时间,给出了指向本地变量的指针,该变量保留在其中并且在此线程休眠时被其他线程写入。

如果您使用的是Linux,我建议您尝试valgrind(虽然我不确定它是否可以捕获无效的堆栈访问权限),但是在Windows上我不知道有任何用于调试此工具的工具有点问题。您可以仔细检查,然后尝试禁用功能的各个部分,以查看问题何时消失以缩小可能的范围。

我还习惯使用duma库取得了一些成功,但它只能捕获对堆的无效访问,而不是堆栈。

注意:clang和gcc都在实现C ++ 11而不是MSVC ++,所以如果你不使用很多特定于Windows的东西,可能很容易移植并尝试使用valgrind。 Gcc和特别是clang也因提供比MSVC ++更好的静态诊断而闻名,所以如果你用gcc或clagn编译它,你可能会得到一些警告,指出你的问题。