在循环内为类成员声明线程时,需要解释HEAP和STACK
Explanation needed about HEAP and STACK when declaring threads for class members inside a loop
让我们用代码开始吧:
#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
。
有两种可能的解决方案:
-
如果线程应该独立于程序的其余部分工作,甚至可能在程序的其余部分退出时存活,您可以
detach
它 -
正常的情况是,你存储线程某处,例如在一个
std::vector
,当你完成你告诉线程退出(如何做到这是另一个问题),然后你join
线程。
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- 在 C++ 中解释多维向量的语句时感到困惑
- 解释一下 for (char c : str) 的作用?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 隐式重新解释引用时强制转换,没有警告/错误
- 在循环内为类成员声明线程时,需要解释HEAP和STACK