我得到线程睡眠错误在c++ 11线程
i get thread sleep error in C++11 threading
我使用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);
}
我假定_Now
是sleep_for
实现深处某处的局部变量。如果它损坏了,要么是该函数有bug(不太可能),要么是应用程序的其他部分正在写入悬空指针(更有可能)。
最可能的原因是,在调用sleep_for
之前的一段时间,你给出了一个指向本地变量的指针,该指针留在周围,并且在该线程休眠时由其他线程写入。
如果你在Linux上,我建议你尝试valgrind(虽然我不确定它可以捕获对堆栈的无效访问),但在Windows上,我不知道有什么工具可以调试这种问题。你可以做仔细的检查,你可以尝试禁用功能的各个部分,看看问题什么时候消失,以缩小问题的范围。
我也曾经使用过duma库,并取得了一些成功,但它只能捕获对堆的无效访问,而不是堆栈。
注意:clang和gcc在实现c++ 11方面都比msvc++更进一步,所以如果你不使用太多windows特定的东西,可能很容易移植并尝试valgrind。与msvc++相比,Gcc,尤其是clang提供了更好的静态诊断,因此,如果您使用Gcc或clagn编译它,您可能会得到一些警告,指出问题所在。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 为什么我不能在 while 循环中创建线程?