C++ win32线程createThread函数没有正确传递参数

标签 c++ multithreading pointers winapi

所以,我一直在努力弄清楚c++多线程是如何工作的,以及如何将它应用到我正在从事的项目中。我正在尝试完成创建一个新线程并在该线程上运行一个函数。我尝试运行的函数称为 SetupInfo 并将 Individual 作为单个参数。我看过这样的例子并尝试实现它们,但经过多次尝试后,我无法成功地将我需要的参数传递到我希望函数运行的线程中。这是我想出的:

我在这里创建了一个结构来存储指向我稍后需要的 Individual 的指针。

struct ThreadData
{
 Individual *m_pInd;
 ThreadData(Individual pInd) : m_pInd(*pInd) {}
};

在这里,我创建了一个函数,我可以在我的程序中调用该函数,该函数创建运行函数 SetupThreadFunction 的线程,该函数采用空指针作为参数。我正在尝试将变量 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 线程中?

最佳答案

正确的模式是用new分配对象,填充数据(如果不是通过参数给new),传递指针给新创建的线程,并让线程在完成对象后删除该对象。您甚至在知道线程已经启动之前就删除了对象!

关于C++ win32线程createThread函数没有正确传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324341/

相关文章:

c++ - 对齐对 C++11 中的性能真的很重要吗?

c++ - 我需要在 autoexp.dat 中输入什么才能检查 vector 中包含的类的数据成员?

c++ - 不同物体碰撞

c++ - "set with class member as key"的最佳数据结构?

c - 如何在结构成员数组中应用限制指针类型关键字?

c# - 如何停止非响应线程

java - Eclipse 中的线程自动停止(卡住)

java - 服务器多线程一次仅应答一个客户端

c++ - 为什么在更改范围时指向 boost 共享内存中的对象的指针会变得无效?

c# - 添加一个实例以引用另一个实例中的字段