Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程没有被破坏_C++_Multithreading_Visual Studio 2010_Thread Synchronization - Fatal编程技术网

C++ 线程没有被破坏

C++ 线程没有被破坏,c++,multithreading,visual-studio-2010,thread-synchronization,C++,Multithreading,Visual Studio 2010,Thread Synchronization,我在一个多线程系统上工作这是我的代码 类demo在.h文件中定义 当主函数的循环第二次执行时,下面的COMMENT1取上一个值 关闭句柄不关闭线程吗 int threadentry(void* data) { demo* inst=(demo*) data; cout << "Value of inst "<<hex << &inst<< endl; string request; cin>>reque

我在一个多线程系统上工作这是我的代码 类demo在.h文件中定义

当主函数的循环第二次执行时,下面的COMMENT1取上一个值

关闭句柄不关闭线程吗

int threadentry(void* data)
{
   demo* inst=(demo*) data;
   cout << "Value of inst  "<<hex << &inst<< endl;
   string request;
   cin>>request;
   if(request==play)
   {
      inst->play;  
      cout << "Value of inst  "<<hex << &inst<< endl;
      // COMMENT1 here when the thread is executed second time from the main it is taking previous value
   }
}

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;
      //here is some Processing of data and after processing I close the handle
      CloseHandle(threads);
      delete inst;
      system("pause");
   }
}
int-threadentry(void*数据)
{
演示*仪器=(演示*)数据;
coutNo——关闭线程的句柄不会破坏线程本身。当线程完成其工作时,它应该退出(通过调用
ExitThread
或从thread函数返回)

在紧急情况下,您可以使用
TerminateThread
终止线程,但这应该为真正的紧急情况保留——它可能会使进程处于不稳定状态,因此通常应该避免这种情况,如果必须使用它,您可能希望在之后尽快关闭进程

还要注意,在使用标准库的程序中,直接使用
CreateThread
并不是真正安全的——您应该调用
\u beginthread
\u beginthreadex
。这些设置允许线程安全地使用使用静态存储的标准库函数(例如,
strtok
mktime
,但还有很多)。

否——关闭线程句柄不会破坏线程本身。线程在完成其工作后应退出(通过调用
ExitThread
或从线程函数返回)

在紧急情况下,您可以使用
TerminateThread
终止线程,但这应该为真正的紧急情况保留——它可能会使进程处于不稳定状态,因此通常应该避免这种情况,如果必须使用它,您可能希望在之后尽快关闭进程

还要注意,在使用标准库的程序中,直接使用
CreateThread
并不是真正安全的——您应该调用
\u beginthread
\u beginthreadex
。这些设置允许线程安全地使用使用静态存储的标准库函数(例如,
strtok
mktime
,但还有很多)。

删除所有那些“(键入)foo”强制转换,它们迫使编译器接受事实上不适合的内容。您必须通过使用适当的类型替换内容来修复其中的一些错误。对于传递到线程的上下文指针,从
demo*
void*
的转换是隐式的。正确的转换是
静态转换(数据)
。如果需要,也可以使用静态转换进行隐式转换。函数中也缺少返回值,唯一允许的情况是main()。我提到的原因是,在形式上,程序中可能会发生任何事情,因为这些事情会导致未定义的行为

然后,您输出的是“inst的值”,但实际上输出的是名为“inst”的局部变量的地址,这是不同的。这可能只是增加了您的混淆

现在,谈到您的问题,CloseHandle()不会停止线程。它只会释放您的句柄。您需要的是WaitForSingleObject()或它的兄弟之一。

删除所有那些“(type)foo”强制转换,它们迫使编译器接受事实上不适合的内容。您必须通过使用适当的类型替换内容来修复其中的一些错误。对于传递到线程的上下文指针,从
demo*
void*
的转换是隐式的。正确的转换是
静态转换(数据)
。如果需要,也可以使用静态转换进行隐式转换。函数中也缺少返回值,唯一允许的情况是main()。我提到的原因是,在形式上,程序中可能会发生任何事情,因为这些事情会导致未定义的行为

然后,您输出的是“inst的值”,但实际上输出的是名为“inst”的局部变量的地址,这是不同的。这可能只是增加了您的混淆


现在,说到你的问题,CloseHandle()并没有停止线程。它只是释放了你的句柄。你想要的是WaitForSingleObject()或它的一个兄弟。是的,我同意你一直想要的解决问题。谢谢你指出错误,但是如果我想从主函数终止线程(我在哪里调用closeHandle)我可以在那里使用终止线程吗?在web上搜索“线程取消”你会发现强制终止会带来一些与共享数据状态有关的风险。除非你真的、真的知道你在做什么,并在线程中专门编写代码以确保取消安全,否则不要这样做。你还没有到,所以告诉线程终止并等待它,甚至让它在后台运行。请注意,在程序终止时,所有其他线程都将被取消,以防您担心。是的,我同意您可能希望解决的问题。谢谢您指出错误,但是如果我想从主函数(我调用closeHandle)终止线程我可以在那里使用终止线程吗?在网上搜索“线程取消”你会发现强制终止会带来一些与共享数据状态有关的风险。除非你真的、真的知道你在做什么,并在线程中专门编写代码以确保取消安全,否则不要这样做。你还没有到,所以告诉线程终止并等待它,甚至让它在后台运行。请注意,在程序终止时,所有其他线程都将被取消,以防引起您的担忧。我想在关闭句柄时立即关闭线程。我可以在此处使用TerminateThread吗?在这种情况下,我是否有导致内存泄漏的风险?您是否希望线程运行?如果不希望,请不要