线程的自动释放、挂起、运行

1、自动释放线程对象

CWinThread *m_jyTestThread;
m_jyTestThread = ::AfxBeginThread(ThreadFun, (LPVOID)this, THREAD_PRIORITY_NORMAL, 4 * 1024 * 1024, 0);
if(m_jyTestThread!=NULL)
{
  //m_bAutoDelete = TRUE; 系统自己清理CWind对象,当然还包括CloseHandle(),ExitInstance()等等一堆函数的调用,程序退出时,就不需要再释放m_jyTestThread对象
  m_jyTestThread->m_bAutoDelete = TRUE;
}

 如上面代码,线程如果创建成功后,就调用 m_bAutoDelete = TRUE;,当现场结束后它会自动释放线程对象,当程序结束时就没必要再释放m_jyTestThread对象,若再次释放就会报错。

2.线程运行

m_jyTestThread->ResumeThread();

ResumeThread():启动线程  If the function succeeds, the return value is the thread's previous suspend count; otherwise, it is (DWORD) -1.

解释:ResumeThread函数并不能保证线程真地继续执行,为什么呢?每一个线程都有一个线程暂停计数器,当线程正在运行时计数器为0,当其他线程对此线程使用SuspendThread函数时计数器会增加1,调用ResumeThread会使计数器减小1,所以当调用SuspendThread函数后计数器变为1。但是Windows是一个多线程操作系统,所以很有可能某个其他的线程也对此线程调用了SuspendThread,这时计数器就会变为2,这时再调用ResumeThread只会使计数器变回为1,线程将继续暂停,直到计数器变为0。那么,如何确定线程是否真地被继续执行了呢?很简单,检查函数返回值就可以了。如果返回值为0,则表示线程已经恢复执行了,如果不为0,则表示线程继续被暂停,如果为0xffffffff,则说明函数调用失败了。

3.线程挂起

m_jyTestThread->SuspendThread();

SuspendThread():挂起线程 If the function succeeds, the return value is the thread's previous suspend count; otherwise, it is (DWORD) -1.

解释和2差不多,这里就不多解释。

111
原文地址:https://www.cnblogs.com/zwj-199306231519/p/14343558.html