我正在创建一个新线程,我在其中传递一个类的对象 class demo在.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");
}
}
我认为值应该是不同的,因为地址被复制到threadentry的数据变量中。如何检查这些是否是传递的对象。
答案 0 :(得分:5)
代码打印指针的地址,而不是对象的地址。涉及两个指针变量(一个在main()
中声明,另一个是线程函数的参数),因此输出不同。从输出语句中删除&
,运算符的地址:
cout << "Value of inst "<<hex << inst << endl;
将提供的对象的所有权授予线程,因为它知道何时完成使用它。在发布的代码中,在创建线程后删除对象,可能导致线程使用悬空指针。将对象的删除从main移动到线程中。
thread function的签名是:
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
并且必须返回一个值,发布的代码不会。
由于CreateThread()
返回的句柄未被关闭,因此代码也有资源泄漏。如果线程不需要加入或存储线程句柄,则立即CloseHandle()
,例如std::vector
加入(例如,使用WaitForSingleObject
)并稍后关闭
答案 1 :(得分:2)
你可能会遇到竞争条件。您在CreateThread
之后立即删除了您的班级实例。此时threadentry()
可能尚未开始执行。