关于标准c++多线程的简单问题

simple question about standard c++ multithreading

嗨,我是学习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 和 documented in the destructor 的一部分:

std::thread::~thread
Destroys the thread object.

If *this has an associated thread (joinable() == true), std::terminate() is called.

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

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