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)
谢谢您的帮助!我尽力做到了