• 多线程代码段 自清理线程


    自清理线程

    #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;
    }
  • 相关阅读:
    delphi Base64
    delphi 注册表
    二、Spring Boot项目的三种启动方式
    Junit的运行流程以及Junit常用注解
    eclips集成单元测试
    六、AcriveMQ集群配置的三种方式,以及组合实现
    五、Sping 中实现简单实现activeMQ
    三、简单实现activeMQ发送消息
    二、安装ActiveMQ消息中间件
    一、消息中间件基础
  • 原文地址:https://www.cnblogs.com/qiantz/p/3186609.html
Copyright © 2020-2023  润新知