将指针数组作为void指针传递给c ++中的新线程

时间:2012-11-08 09:03:48

标签: c++ arrays multithreading pointers void

我目前正在开发一个项目,我必须为C ++ dll构建一个shell,因此新的C#GUI可以使用它的功能。 但是我遇到了以下问题,在C ++部分我必须根据特定原因创建一个新线程,并且我想将一个int数组传递给新线程。 请注意,在发生这种情况的函数中分配给数组的值是从代码的C#部分获得的。

__declspec( dllexport ) void CreateReportPane(int &id, int &what)
{
    DWORD threadId; 
    int iArray[2] = { id, what};    

    HANDLE hThread = CreateThread( NULL, 0, CreateReportPaneThread, iArray, 0,  &threadId);
    if (hThread == NULL) 
    {           
        ExitProcess(3);
    }    
}

问题出现在新线程中,我可以可靠地从数组中取出第一个值,但第二个值似乎被释放,这是另一边的代码。

DWORD WINAPI CreateReportPaneThread(LPVOID lparam)
{
    int id, what;
    id = *(( int * )lparam);
    what = *(((int *)lparam)+1) ; 
    CreateReportPaneOriginal(id, what);

    return 0;
}

有没有办法阻止数组中的值在不保留原始线程的情况下被释放? 非常感谢你提前

2 个答案:

答案 0 :(得分:3)

int iArray[2] = { id, what};    

HANDLE hThread = CreateThread(...,CreateReportPaneThread, iArray, ...);

问题是iArray是一个本地数组,这意味着当函数CreateReportPane()返回时会被破坏。那么CreateReportPaneThread()指的是不存在的。你只是偶然得到第一个价值。没有这样的保证,你甚至可以得到第一个值。

使用动态数组:

int * iArray  = new int[2];
iArray[0] = id;
iArray[1] = what;

HANDLE hThread = CreateThread(...,CreateReportPaneThread, iArray, ...);

CreateReportPaneThread完成数组后,请记得编写 deallocate 数组:

DWORD WINAPI CreateReportPaneThread(PVOID *data)
{
     int *array = static_cast<int*>(data);

     int id = array[0], what = array[1];

     delete []array; //MUST DO IT to avoid memory leak!

     //rest of your code
}

答案 1 :(得分:2)

动态分配数组以防止在CreateReportPane()退出时数组超出范围:

int* iArray = new int[2];
iArray[0] = id;
iArray[1] = what;    

否则线程正在访问不再有效的数组,这是未定义的行为。当不再需要时,线程例程CreateReportPaneThread()必须delete[]数组(注意使用delete[]而不是delete)。