3

我正在创建一个新线程,我在其中传递一个在 .h 文件中定义的类演示对象

int threadentry(void* data)
{
   demo* inst=(demo*) data;
   cout << "Value of inst  "<<hex << &inst<< endl;//value is different from below
}

int main()
{
while(1)
{
    demo* inst=new demo();
    cout << "Value of inst  "<<hex << &inst<< endl;  //value is coming different from above
    HANDLE threads;
    DWORD threadId1;
    if ((threads = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadentry,
        (void *)inst, 0, &threadId1)) == NULL)
        return -1;
    delete inst;
    system("pause");
}
}

我认为值应该不同,因为地址被复制到线程条目的数据变量中。我如何检查这些是否与传递的对象相同。

4

2 回答 2

5

该代码正在打印指针的地址,而不是对象的地址。涉及到两个指针变量(一个在 in 中声明,main()另一个是线程函数的参数),因此输出不同。从输出语句中删除&运算符的 , 地址:

cout << "Value of inst  "<<hex << inst << endl;

将提供的对象的所有权授予线程,因为它知道何时完成使用它。在发布的代码中,对象在创建线程后被删除,可能导致线程使用悬空指针。将对象的删除从 main 移动到线程中。

线程函数的签名是:

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

它必须返回一个值,发布的代码没有。

该代码还存在资源泄漏,因为返回的句柄CreateThread()未关闭。CloseHandle()如果线程不需要连接或存储线程句柄,则立即std::vector连接,例如,连接(使用WaitForSingleObject例如)并稍后关闭。

于 2013-07-16T05:39:40.790 回答
2

您可能会遇到比赛条件。您在 之后立即删除您的类实例CreateThread。此时threadentry()可能尚未开始执行。

于 2013-07-16T05:41:54.250 回答