这是我的头脑。我正在尝试多线程使用我的c ++代码。我将所有(很多)参数放入结构
中struct ARGS{
//argument definitions
};
ARGS funcArgs = //function arguments
并使用
将其传递给我的函数Handles[0] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)myFunc,&funcArgs,0,NULL)
函数定义类似于
void myFunc( void *funcArgs_ ){
ARGS *funcArgs = (ARGS*)funcArgs_;
//do stuff here
}
我已经成功地使用了这个方法来创建一个单独的线程来运行我的主函数而不用我的gui挂起。我现在遇到的问题是我想要运行四个独立的线程,并修改每个新线程之间的一些输入参数,但是因为它是由指针传递的,所以它会影响在先前线程中执行的计算。我意识到我可以简单地创建一个ARGS类型的新变量并将其传递给第二个线程,但funcArgs中的一个参数是大约6GB数据的vector<vector<double> >
,因此我无法将其复制到一个新的结构,并且它对于每个线程保持不变,因此复制它将完全浪费RAM。
我很乐意为不需要更改的大变量创建一个数据结构,而另一个用于更改的小变量,但是CreateThread
只接受一个参数的函数,所以我可以不这样做。
我认为我可以做的另一件事是创建一个ARGS类型的新变量,但通过执行来解决复制数据的问题
struct ARGS{
vector<vector<double> > *hugeArrayPtr;
//other argument definitions
};
但我尝试了这个,当我尝试取消引用指针时,我得到“错误C2100:非法间接”。事实证明,这是因为我使用索引迭代数组(向量)元素,并且当使用指向向量的指针时,您需要使用迭代器。这样做的麻烦在于它需要重写我的代码,而且我不完全确定如何去做。所以这将是非常耗时的,我可能最终只会造成比我解决的更多问题。
最终,可能会发现这是唯一的方法,但我希望有一个更简单的解决方案。任何帮助都会非常感激。
答案 0 :(得分:0)
您可以将指针传递给线程函数,但是在内部,创建一个带有接收信息的参数结构,复制所有参数。实际上,您正在为所有线程共享相同的信息。
void myFunc( void *funcArgs_ )
{
ARGS funcArgs(*((ARGS*)funcArgs_)); // ARGS copy constructor
}
此外,你必须记住这是一个线程代码,你没有在主线程中更改参数的保险,同时你在线程中复制你的参数。因此,在继续创建线程或使用不同的参数struct之前,您可以使用信号量来确保正确复制。
在主线程中:
为线程1创建参数struct 执行线程1 等待信号量 修改线程2的参数值 执行线程2 等待信号量
在线程中:
将参数复制到本地线程存储 主动信号量。
关于vector<vector<double> >
6GB问题,我假设这些信息对所有线程都是通用的,所以,如你所说,在ARGS结构中包含一个指向它的指针。在线程中使用ARGS复制构造函数,您将无法从参数中获取此指针,并且稍后在线程中使用它。
struct ARGS{
vector<vector<double> > *hugeArrayPtr;
//other argument definitions
ARGS(const ARGS & arg) :
hugeArrayPtr(arg.hugeArrayPtr),
// other argument copy
{
}
};