【发布时间】:2015-12-16 23:51:04
【问题描述】:
所以,我一直在试图弄清楚 c++ 多线程是如何工作的,以及如何将它应用到我正在从事的项目中。我正在尝试完成创建一个新线程并在该线程上运行一个函数。我尝试运行的函数称为SetupInfo,并将Individual 作为单个参数。我已经看到了这样的示例并尝试实现它们,但是经过多次尝试后,我无法成功地将所需的参数传递到我希望函数在其上运行的线程中。这是我想出的:
在这里我创建了一个结构来存储指向Individual 的指针,我稍后需要它。
struct ThreadData
{
Individual *m_pInd;
ThreadData(Individual pInd) : m_pInd(*pInd) {}
};
在这里,我创建了一个可以在程序中调用的函数,该函数创建了运行函数 SetupThreadFunction 的线程,该函数将 void 指针作为参数。我正在尝试将变量 data 传递给此函数,然后将其转换回 ThreadData 以便能够访问结构的项目。
void SetupThread(Individual input)
{
ThreadData *data = new ThreadData(input);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SetupThreadFunction, data , 0, 0);
delete data;
}
在这里,我创建了传递给CreateThread 函数的函数,该函数接受一个空指针并将其转换为ThreadData,然后理论上可以访问threadData->m_pInd。上面data 的相同指针被正确传递到SetupThreadFunction。但是,m_pInd 包含空数据,而不是指向预期信息的指针。 为什么会这样?
DWORD WINAPI SetupThreadFunction(LPVOID lpParameter)
{
ThreadData* threadData = (ThreadData*)lpParameter;
SetupInfo(threadData->m_pInd);
return 0;
}
有没有更正确的方法将参数传递到我正在创建的新 win32 线程中?
【问题讨论】:
-
所以,我一直在试图弄清楚 c++ 多线程是如何工作的——我不明白你发布的第一个
struct应该如何工作,线程或没有线程。你取临时参数的地址? -
第一个问题,你不应该删除
SetupThread中的data。在SetupThreadFunction中使用后应将其删除。否则,您已经设置了一个悬空指针。请记住,CreateThread在SetupThreadFunction完成执行之前返回(可能在它开始执行之前)。 -
另外,当线程可能仍在运行时,为什么要删除数据?多线程不仅仅是调用
CreateThread。您需要适当的同步,也可能需要“等待”线程完成执行,然后再插入数据。 -
@fudge22it
Individual到底是什么? -
SetupThread按值获取参数。这意味着当SetupThread被调用时,作为input传递的任何内容都会被复制,并且在函数返回时它不再存在。如果你取input的地址,你取的是临时地址(我没看到你实际上取了地址)。您必须确保它的生命周期至少与SetupThreadFunction完成执行时一样
标签: c++ multithreading pointers winapi