Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在循环内为类成员声明线程时,需要解释堆和堆栈_C++_Multithreading_Class_Heap Memory_Stack Memory - Fatal编程技术网

C++ 在循环内为类成员声明线程时,需要解释堆和堆栈

C++ 在循环内为类成员声明线程时,需要解释堆和堆栈,c++,multithreading,class,heap-memory,stack-memory,C++,Multithreading,Class,Heap Memory,Stack Memory,让我们来看看代码: #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) {

让我们来看看代码:

#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;
}
#包括
#包括
使用名称空间std;
分类{
公众:
使某些函数无效(){
对于(int i=0;i<10;i++)
库特
我假设在这种情况下,线程可以独立运行,直到它按照自己的方式完成

start.join();
但是调用线程是毫无意义的。第三种可能是存储您提到的线程,并在以后需要同步时加入它们

我假设在这种情况下,线程可以独立运行,直到它按照自己的方式完成

start.join();

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

有两种可能的解决方案:

  • 如果线程应该独立于程序的其余部分工作,甚至可能在程序的其余部分退出时仍然存在,那么您可以选择它

  • 通常情况下,您将线程存储在某个位置,例如,存储在
    std::vector
    中,完成后,您会告诉线程退出(如何退出是另一个问题),然后删除该线程


  • 有两种可能的解决方案:

  • 如果线程应该独立于程序的其余部分工作,甚至可能在程序的其余部分退出时仍然存在,那么您可以选择它

  • 通常情况下,您将线程存储在某个位置,例如,存储在
    std::vector
    中,完成后,您会告诉线程退出(如何退出是另一个问题),然后删除该线程


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


    无需对向量、join等进行任何大规模的恐慌/戏剧化操作。

    只需使用new创建一个something实例,使用其指针作为参数创建线程,让线程在线程函数结束时将其删除即可



    不需要对向量、join等进行任何大规模的恐慌/戏剧化。

    “分配的内存不会被释放,除非我们这样做,我们根本不知道什么时候这样做”-当然可以-在线程函数结束时删除它。但是你知道什么时候可以释放分配的内存-当线程完成时。我想尝试大家提到的方法从逻辑上讲,它应该可以工作,但问题是,现在有另一个问题;线程在完成所有操作时导致中止,这是为什么?我使用的代码与我在主要问题中共享的代码完全相同,但这次我使用的是类的动态分配。我相信我刚才评论的问题是通过分离t来解决的线程,所以我基本上是用一个指向类实例的指针启动一个线程,分离该线程,并确保该线程将删除该传递指针指向的已分配内存。这是正确的方法吗?@MarioAda听起来不错:)“除非我们所以,我们根本不知道什么时候应该这样做——当然,你应该这样做——在线程函数的末尾删除它。但是你知道什么时候可以释放分配的内存——当线程完成时。我想尝试大家提到的,因为从逻辑上讲,它应该可以工作,但问题是,现在,有另一个问题;线程导致了一个错误bort当它完成所有操作时,这是为什么?我使用的代码与我在主要问题中共享的代码完全相同,但这次我对类使用了动态分配。我相信我刚才的评论是通过分离线程来解决的,所以我基本上要做的是使用指向实例的指针启动一个线程e类,分离线程,并确保线程将删除由传递的指针指向的分配内存。这是正确的方法吗?@MarioAda听起来不错:)那么你是说我基本上可以将指针作为参数传递给线程,然后让线程删除分配的内存?这听起来像是删除当我们不使用线程时,我会这样做。不管怎样,我下班后会试试。是的,就是这样。这不是“删除这个”-线程是一个实体,东西是另一个。在一个线程中创建一个对象实例,(op.new),发信号,(作为线程创建参数或稍后使用P-C队列),实例指针指向另一个线程并在该线程中删除它是线程间通信的一种绝对正常和常见的方式。因此,你是说我基本上可以将指针作为参数传递给我的线程,然后让线程删除分配的内存?这听起来像是在不使用线程时删除它。无论如何,我会这样做等我下班回来再试试。是的。就是这样。不是“删除这个”-线程是一个实体,东西是另一个。在一个线程中创建一个对象实例,(op.new),发出信号,(作为线程创建参数或稍后使用P-C队列),指向另一个线程并在该线程中删除它的实例指针是线程间通信的一种绝对正常和常见的方式。2不是一个选项,但1听起来很像,感谢您的共享。@MarioAda小心不要调用
    exit
    或从
    main
    函数直接返回
    ,因为这样会结束进程d所有线程,包括分离的线程。您需要使用依赖于平台的函数退出主线程,例如在OSX和Linux等POSIX系统上。2不是选项,但1听起来像,感谢您的共享。@MarioAda小心不要调用
    exit
    或直接调用它