C++ 有没有办法将线程连接到另一个函数中?(即,在it自身范围之外)

C++ 有没有办法将线程连接到另一个函数中?(即,在it自身范围之外),c++,multithreading,pointers,C++,Multithreading,Pointers,假设我正在创建多个线程,基于我在运行程序时给程序提供的参数量。它的代码如下所示: ProgThread aProgThreads[nArgc-1]; for(int p=0;p<nArgc-1;p++){ aProgThreads[p].init(); } void ProgThread::init(){ std::thread oMainThread(&ProgThread::loop, *this); //Creates a thread that execu

假设我正在创建多个线程,基于我在运行程序时给程序提供的参数量。它的代码如下所示:

ProgThread aProgThreads[nArgc-1];
for(int p=0;p<nArgc-1;p++){
    aProgThreads[p].init();
}
void ProgThread::init(){
    std::thread oMainThread(&ProgThread::loop, *this); //Creates a thread that executes the loop function
}
for(int p=0;p<nArgc-1;p++){
        aProgThreads[p].joinThread();
}
现在,因为我要处理多个线程,所以我不能在
init()
函数中连接它们。这意味着我必须在它们全部被创建之后加入它们。按照当前编写此代码的方式,这是不可能的,因为
oMainThread
将不存在于
init()
函数之外。有没有一种方法可以让我有一个单独的循环来连接所有的线程?它看起来像这样:

ProgThread aProgThreads[nArgc-1];
for(int p=0;p<nArgc-1;p++){
    aProgThreads[p].init();
}
void ProgThread::init(){
    std::thread oMainThread(&ProgThread::loop, *this); //Creates a thread that executes the loop function
}
for(int p=0;p<nArgc-1;p++){
        aProgThreads[p].joinThread();
}

提前谢谢

示例中的主要问题是
onInit
中的
std::thread oMainThread
。这会创建一个线程,是的,但当您从
onInit
返回时,它也会尝试销毁该线程。而这确实会失败,因为
oMainThread
尚未加入

相反,
join
需要位于
ProgThread
的析构函数中,这意味着
oMainThread
需要是成员。当然,与所有成员一样,它应该在
ProgThread
的构造函数中初始化


您想要循环的唯一原因是当您的线程在加入之前需要被告知何时停止时。在这种情况下,明智的做法是告诉所有线程停止,然后才开始加入它们。告诉一个线程停止,然后加入该线程,然后告诉下一个线程等等,这将需要更多的时间。

您的示例中的主要问题是
onInit
中的
std::thread oMainThread
。这会创建一个线程,是的,但当您从
onInit
返回时,它也会尝试销毁该线程。而这确实会失败,因为
oMainThread
尚未加入

相反,
join
需要位于
ProgThread
的析构函数中,这意味着
oMainThread
需要是成员。当然,与所有成员一样,它应该在
ProgThread
的构造函数中初始化


您想要循环的唯一原因是当您的线程在加入之前需要被告知何时停止时。在这种情况下,明智的做法是告诉所有线程停止,然后才开始加入它们。告诉一个线程停止,然后加入该线程,然后告诉下一个线程等等,这将需要更多的时间。

使
oMainThread
成为
ProgThread
类的成员。这样,它既可以在
ProgThread::init
上使用,也可以在
ProgThread::joinThread
上使用?在C++中,我们使用构造函数初始化对象。代码>ProgThread aProgThreads[nArgc-1]已经为每个对象调用了
ProgThread::ProgThread
。@MSalters,有时你想“初始化”一些东西,但是在构建对象时这样做并不方便。OP的问题很好地说明了一个事实:OP被阻止将
std::thread
数组作为成员,因为
std::thread
类在不启动线程的情况下无法构建对象。IMO:
std::thread
如果像Java的
Java.lang.thread
类那样工作,那么它的用途会更广泛:在Java中,您可以构造一个
thread
实例,然后再
start()
它。IMO:构造函数存在的主要原因是让新对象处于可以安全调用析构函数的状态。如果方便的话,构造函数还可以做其他事情,但那只是肉汁。@SolomonSlow有一个默认构造函数,它创建了一个
std::thread
,该构造函数“不代表线程”,使
oMainThread
成为
ProgThread
类的成员。这样,它既可以在
ProgThread::init
上使用,也可以在
ProgThread::joinThread
上使用?在C++中,我们使用构造函数初始化对象。代码>ProgThread aProgThreads[nArgc-1]已经为每个对象调用了
ProgThread::ProgThread
。@MSalters,有时你想“初始化”一些东西,但是在构建对象时这样做并不方便。OP的问题很好地说明了一个事实:OP被阻止将
std::thread
数组作为成员,因为
std::thread
类在不启动线程的情况下无法构建对象。IMO:
std::thread
如果像Java的
Java.lang.thread
类那样工作,那么它的用途会更广泛:在Java中,您可以构造一个
thread
实例,然后再
start()
它。IMO:构造函数存在的主要原因是让新对象处于可以安全调用析构函数的状态。如果方便的话,构造函数也可以做其他事情,但那只是肉汁。@SolomonSlow有一个默认构造函数,它创建了一个
std::thread
,它“不代表线程”,我试图使它成为函数的成员。不幸的是,当我编译它时,它给了我一个错误,说“OsThread::OsThread(const-OsThread&)”被隐式删除,因为默认定义的格式将是错误的&
注意:这里声明的thread(const-thread&)=delete。是否有任何方法可以更改标题中的声明以解决错误?您理解错误吗?这是默认的复制构造函数。无法复制正在运行的线程。这里的解决方案取决于具体情况。为什么要复制一个
OsThread
,这意味着什么?哦,看来我在构造函数中犯了一个语法错误。我没有键入
ProgThread::ProgThread():oMainThread(std::thread(&ProgThread::loop,*this))
而是这样写的
ProgThread::ProgThread():oMainThread(&ProgThread::loop,*this)
谢谢您的帮助!我尽力做到了