自清理线程
#include "stdafx.h" #include<iostream> #include <memory> // include auto_ptr #include <process.h> // include _beginthreadex _endthreadex; using namespace std; class CQTZ_Thread_AutoClear { friend unsigned int __stdcall _THREAD_FUN_(LPVOID lpvData); public: //创建线程接口函数 static bool Thread_Create(void) { CQTZ_Thread_AutoClear *_thread_obj=new CQTZ_Thread_AutoClear(); return _thread_obj->_Thread_Active(); } // virtual ~CQTZ_Thread_AutoClear(void) { cout<<"~CQTZ_Thread_AutoClear(void)"<<endl; } //线程任务接口函数 virtual void Thread_Task(void) { int _start_data=12; for (int i=0; i<_start_data; i++) { ::Sleep(500); cout<<"thread id="<<::GetCurrentThreadId()<<" i="<<i<<endl; } } private: CQTZ_Thread_AutoClear(void) { cout<<"CQTZ_Thread_AutoClear(void)"<<endl; } //创建线程 bool _Thread_Active(void) { HANDLE _hthread = (HANDLE)_beginthreadex(NULL,0,_THREAD_FUN_,this,0,0); if (_hthread) { ::CloseHandle(_hthread); return true; } else { return false; } } }; //线程函数 unsigned int __stdcall _THREAD_FUN_(LPVOID lpvData) { { // CQTZ_Thread_AutoClear 对象要在 _endthreadex函数执行前清理 否则会内存泄漏 CQTZ_Thread_AutoClear *pthread = (CQTZ_Thread_AutoClear *)lpvData; auto_ptr<CQTZ_Thread_AutoClear> _thread_ptr(pthread); pthread->Thread_Task(); } _endthreadex(0); return 0; } //主线程函数 int _tmain(int argc, _TCHAR* argv[]) { CQTZ_Thread_AutoClear::Thread_Create(); system("pause"); return 0; }