加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 通过Threadcreate传递指针值

发布时间:2020-12-16 09:46:18 所属栏目:百科 来源:网络整理
导读:我正在创建一个新的线程,我在其中传递一个类的对象 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(); c
我正在创建一个新的线程,我在其中传递一个类的对象
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,(LPTHREAD_START_ROUTINE)threadentry,(void *)inst,&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()返回的句柄未关闭.如果线程不需要连接或者存储线程句柄,例如std :: vector中要连接(例如使用WaitForSingleObject)并稍后关闭,则立即CloseHandle().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读