首页 > 解决方案 > 关于标准 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())还是我错过了其他东西?

标签: c++multithreadingdetach

解决方案


std::thread您需要在对象被破坏之前分离或连接对象。这是 API 的一部分,并记录在析构函数中

std::thread::~thread
销毁线程对象。

如果 *this 有一个关联线程(joinable() == true),则调用 std::terminate()。

您通常想要的是加入线程,这会阻塞当前线程,直到另一个线程完成。

如果你想要一个在销毁时自动加入的线程,你可以使用C++20 的 std::jthread代替。


推荐阅读