在循环内为类成员声明线程时,需要解释HEAP和STACK

Explanation needed about HEAP and STACK when declaring threads for class members inside a loop

本文关键字:解释 HEAP STACK 线程 循环 声明 成员      更新时间:2023-10-16

让我们用代码开始吧:

#include <thread>
#include <iostream>
using namespace std;
class something {
public:
    void some_function() {
        for (int i = 0; i < 10; i++)
            cout << 1;
    }
};
int main()
{
    while (true)
    {
        something something_class;
        thread start(&something::some_function, &something_class);
    }
    return 0;
}

这将不起作用,这基本上是因为something_class变量在循环结束时被释放,而线程正在使用它,这将导致一个严重的错误。

使用动态分配并不更好,因为分配的内存不会被释放,除非我们这样做,我们根本不知道什么时候这样做…

我们可以通过声明全局变量、向量或其他东西来解决这个问题。但这也不好,特别是如果我们有一个由大量类和函数组成的大程序,这些类和函数应该一起运行。

这里的解决方案是什么?我真的不知道,我能想到的是声明向量和全局变量来解决这个问题,但这是不对的,因为我将需要很多。

用new创建一个something实例,用它的指针作为参数创建线程,让线程在线程函数结束时删除它。

不需要任何大规模的恐慌/戏剧与矢量,加入等

while (true)
{
    something something_class;
    thread start(&something::some_function, &something_class);
    start.detach();
}

我假设在这种情况下,线程可以独立进行,直到它按照自己的条件完成。否则,您需要调用

start.join();

,但是调用线程是毫无意义的。第三种可能是存储您提到的线程,并在以后需要同步时对它们进行join

有两种可能的解决方案:

  1. 如果线程应该独立于程序的其余部分工作,甚至可能在程序的其余部分退出时存活,您可以detach

  2. 正常的情况是,你存储线程某处,例如在一个std::vector,当你完成你告诉线程退出(如何做到这是另一个问题),然后你join线程。