c++ - 通过 Threadcreate 传递时指针值发生变化

标签 c++ multithreading pointers

我正在创建一个新线程,在其中传递一个类对象 类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 的数据变量中。我如何检查这些是传递的同一个对象。

最佳答案

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

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

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

thread function 的签名是:

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

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

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

关于c++ - 通过 Threadcreate 传递时指针值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17668752/

相关文章:

java - 抽象计划服务 : shutdown underlying executor

c - 学习 'Linked lists' 的速度太快,但又不太熟悉指针? #C语言初学者

c++ - 使用 C++ 从设备文件描述符中检索 Linux 中的设备信息

c++ - 我可以用 premake 打印最终组装的 gcc 命令吗?

c++ - 如何使用 indy 10.5.5 c++ 写入和读取 Stream

c++ - 当一个线程正在编写另一个线程可能同时执行的代码时,如何在 ARM 上进行同步?

C++ strtok 无法获得 2 个 token Borland

java - JavaME 和/或 Proguard 会重新排序分配吗?

c++ - 从字符串中删除一个字符

objective-c - 如何在 ARC 下将 objective c 对象的地址获取到 void * volatile * 中?