多线程学习心得(一)----- 让人捶地的ExitThread

在学习多线程过程中,作者通过创建一个对话框B和计时线程C,发现使用ExitThread终止线程时,不仅结束目标线程C,还意外关闭了对话框B。为解决问题,作者转向使用TerminateThread来安全停止计时线程,但意识到这可能带来安全风险。目前,作者采取TerminateThread后关闭句柄的方式来清理资源,对于潜在的后遗症尚不清楚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习多线程中,做了一个例子,从一对话框A,生成新线程的B,然后B里面有个计时的子线程C,

B的头文件定义了

    

    DWORD dthread;
    HANDLE hthread;

 

有全局变量:

   volatile b_true=TRUE;
HWND thrhwnd;
int ii;
void ThreadTime()
{
  
  CTime time;
 CString strTime;
 b_true=TRUE;
  ii = 1;
 while(b_true)
 {
  time=CTime::GetCurrentTime();
  strTime=time.Format(_T("%H:%M:%S"));
//  SetDlgItemText(thrhwnd,IDC_TRI,strTime);
   ii++;
  Sleep(1000);
  }
}

 

然后在B的OnInitDialog()里加上

    hthread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadTime,NULL,0,&dthread);

 

在B中放置一按钮“Kill”,点击事件为:

    ExitThread(dthread);

 

好了,问题来了,由Debug发现,在建立那个计时线程时,传入dthread的ID为3800,而对话框B自身的ID为4060。

按下按钮Kill!ExitThread(dthread);中dthread是3800!成功,单步运行!战!对话框B不见了!-_-凸

debug若干次+百思不得其解后gg,发现好像不是只是我一个人是这样,不少人也有同样的问题,转用TerminateThread,停止计时线程成功,B继续运作。—皿—

 

翻了好几本书,包括一些比较“著名”的,没看到一本有说ExitThread会把除了参数里的那个线程干掉之外,还会把调用它的那个线程也一起给曰了 凸-_-凸。更多的是说TerminateThread不安全,目前暂时没辙,只能TerminateThread后加上CloseHandle清理一下资源,有没有什么后遗症还不知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值