1

这个是我的头脑。我正在尝试在我的 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
}

我已经成功地使用此方法创建了一个单独的线程来运行我的 main 函数,而不会挂起我的 gui。我现在遇到的问题是我想要运行四个单独的线程,并修改每个新线程之间的一些输入参数,但是因为它是通过指针传递的,所以它会影响在之前的线程中执行的计算. 我意识到我可以简单地创建一个 ARGS 类型的新变量并将其传递给第二个线程,但是 funcArgs 中的一个参数是vector<vector<double> >大约 6GB 的数据,所以我不能将它复制到一个新的结构中,并且它对于每个线程都保持不变,因此复制它会完全浪费 RAM。

我很乐意为不需要更改的大变量创建一个数据结构,为确实更改但CreateThread只接受一个参数的函数创建另一个数据结构,所以我不能这样做。

我认为我可以做的另一件事是创建一个类型为 ARGS 的新变量,但通过这样做来解决复制数据的问题

struct ARGS{
    vector<vector<double> > *hugeArrayPtr;
   //other argument definitions
};

但是我尝试了这个,当我尝试取消引用指针时,我得到“错误 C2100:非法间接”。事实证明,这是因为我使用索引来迭代数组(向量)元素,而当使用指向向量的指针时,您需要使用迭代器。这样做的麻烦在于它需要对我的代码进行大量重写,而且我不完全确定如何去做。所以这将非常耗时,而且我最终可能会导致比我解决的问题更多的问题。

最终,这可能是唯一的方法,但我希望有一个更简单的解决方案。任何帮助将不胜感激。

4

1 回答 1

0

您可以将指针传递给线程函数,但在内部,使用接收到的信息创建参数结构,复制所有参数。实际上,您正在为所有线程共享相同的信息。

void myFunc( void *funcArgs_ )
{
    ARGS funcArgs(*((ARGS*)funcArgs_));   // ARGS copy constructor
}

此外,你必须记住这是一个线程代码,你不能保证在主线程中更改参数,同时你在线程中复制你的参数。因此,您可以在继续创建线程或使用不同的参数结构之前使用信号量来确保正确复制。

在主线程中:

为线程 1 创建参数结构 执行线程 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
    {
    }
};
于 2013-05-17T09:42:32.227 回答