关于标准 C++ 多线程的简单问题 [重复]

Posted

技术标签:

【中文标题】关于标准 C++ 多线程的简单问题 [重复]【英文标题】:simple question about standard c++ multithreading [duplicate] 【发布时间】:2020-09-13 04:41:37 【问题描述】:

嗨,我是学习 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++ 来学习如何处理像 C++ 多线程这样的复杂主题?如果你这样做了,那本书对thread::join 函数有什么看法?多线程编程与编写常规的单线程程序不同,这可能是您对结果感到惊讶的原因。 【参考方案1】:

您需要在 std::thread 对象被销毁之前分离或加入它们。这是 API 的一部分,documented in the destructor:

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

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

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

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

【讨论】:

以上是关于关于标准 C++ 多线程的简单问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++多线程

C++ std::thread概念介绍

c++ 多线程与c多线程有啥区别?

[编程基础] C++多线程入门8-从线程返回值

c++多线程编程:实现标准库accumulate函数的并行计算版本

纯 C++ 中的多线程?