c++ - 关于标准 C++ 多线程的简单问题
问题描述
嗨,我是学习 C++ 多线程的新手,这个问题可能看起来很愚蠢,但只是好奇为什么会发生这种情况,如果有人指出引擎盖下发生的事情,那就太棒了
所以,
class background_task
{
public:
void operator()() const
{
for (int i = 0; i < 1000; ++i)
std::cout << "Hello world " << i << std::endl;
}
};
void Func()
{
for(int i=0; i<1000;++i)
std::cout << "Hello world " <<i<< std::endl;
};
void main()
{
background_task bt;
std::thread t(bt);
//t.detach();
}
它给了我运行时错误,说“abort() 已被调用”并且使用 detach() 它工作得很好。无论哪种情况,新线程都会一直执行循环到结束(1000次)我只是猜测错误发生是因为运行时线程退出时还有额外的线程在运行。但即使我调用了 detach(),仍然有额外的线程,并且在这种情况下不会输出任何错误。
我想,在 std::thread 的析构函数中,它检查得像assert(!joinable())
还是我错过了其他东西?
解决方案
std::thread
您需要在对象被破坏之前分离或连接对象。这是 API 的一部分,并记录在析构函数中:
std::thread::~thread
销毁线程对象。如果 *this 有一个关联线程(joinable() == true),则调用 std::terminate()。
您通常想要的是加入线程,这会阻塞当前线程,直到另一个线程完成。
如果你想要一个在销毁时自动加入的线程,你可以使用C++20 的 std::jthread代替。
推荐阅读
- python - Tkinter 如何调整旋转框的大小
- javascript - 'DeprecationWarning: Collection#find: 传递一个函数'
- react-native - 使用 React Hooks 更新位置会出现错误:更新由 AIRMAP 管理的视图的“区域”时出错
- python - Python:如何使用逗号分隔的字符串值在对象变量中拆分不同大小的列表?
- java - 中止詹金斯作业不会停止在后台运行的硒脚本
- javascript - Node.js - 在继续之前从 MySQL 获取返回值
- angular - 如何将数据发布到具有角度 8 关系的表中
- tensorflow - 如何在 TensorFlow 中提取这种切片?
- python - 通过 Bash 运行时出现 ModuleNotFound 错误
- python - 将列添加到 Pandas 数据框时如何避免列和 DatetimeIndex 之间的混淆