zoukankan      html  css  js  c++  java
  • 线程池的封装实现

    微软提供了一套线程池的API,但是直接使用比较费劲,前段时间用的时候做了简单的封装,现记录于此方便以后使用。

    头文件:

    #pragma once
    class CMyThreadPool
    {
    public:
        CMyThreadPool();
        ~CMyThreadPool();
        
    public:
        bool StartNewWork(PTP_WORK_CALLBACK workcallback, PVOID pParam);
    
    private:
        BOOL InitThreadPool();
        void UninitTreadPool();
    
    private:
        PTP_POOL m_threadPool;
        TP_CALLBACK_ENVIRON m_callBackEnviron;
        PTP_CLEANUP_GROUP m_cleanupgroup;
    };

    cpp文件:

    #include "StdAfx.h"
    #include "MyThreadPool.h"
    
    
    CMyThreadPool::CMyThreadPool(void): m_threadPool(NULL), m_cleanupgroup(NULL)
    {
    }
    
    CMyThreadPool::~CMyThreadPool(void)
    {
        UninitTreadPool();
    }
    
    bool CMyThreadPool::StartNewWork(PTP_WORK_CALLBACK workcallback, PVOID pParam)
    {
        if (!InitThreadPool())
        {
            return false;
        }
    
        PTP_WORK new_work = CreateThreadpoolWork(workcallback
            , pParam
            , &m_callBackEnviron);
    
        bool bResult = false;
        if (NULL != new_work)
        {
            SubmitThreadpoolWork(new_work);
            bResult = true;
        }
    
        return bResult;
    }
    
    BOOL CMyThreadPool::InitThreadPool()
    {
        if (NULL == m_threadPool)
        {
            InitializeThreadpoolEnvironment(&m_callBackEnviron);
            m_threadPool = ::CreateThreadpool(NULL);
    
            if (NULL == m_threadPool)
            {
                return FALSE;
            }
    
            SetThreadpoolThreadMaximum(m_threadPool, 5);
            if (!SetThreadpoolThreadMinimum(m_threadPool, 1))
            {
                CloseThreadpool(m_threadPool);
                m_threadPool = NULL;
                return FALSE;
            }
    
            m_cleanupgroup = CreateThreadpoolCleanupGroup();
    
            if (NULL == m_cleanupgroup)
            {
                CloseThreadpool(m_threadPool);
                m_threadPool = NULL;
                return FALSE;
            }
    
            SetThreadpoolCallbackPool(&m_callBackEnviron, m_threadPool);
    
            SetThreadpoolCallbackCleanupGroup(&m_callBackEnviron,
                m_cleanupgroup,
                NULL);
        }
    
        return TRUE;
    }
    
    void CMyThreadPool::UninitTreadPool()
    {
        if (NULL != m_cleanupgroup)
        {
            CloseThreadpoolCleanupGroupMembers(m_cleanupgroup, FALSE, NULL);
            CloseThreadpoolCleanupGroup(m_cleanupgroup);
            m_cleanupgroup = NULL;
        }
    
        if (NULL != m_threadPool)
        {
            CloseThreadpool(m_threadPool);
            m_threadPool = NULL;
        }
    }

    使用的时候只需要实例化一个CMyThreadPool对象,然后调用StartNewWork方法即可。

    注意:上面用的API只有在Vista以上的版本才支持,XP不支持。

    参考MSDN:http://msdn.microsoft.com/zh-SG/library/ms686980

  • 相关阅读:
    JavasScript 实现二分法快排注意点
    JS的面向对象二(通过构造函数的方式)
    JS的面向对象一(通过构造函数的方式)
    leetcode.977_有序数组的平方
    leetcode_38.报数
    leetcode_20.c++有效的括号
    leetcode_21.c++合并两个有序列表
    leetcode_最长公共前缀
    T2_两数相加
    T1_两数之和
  • 原文地址:https://www.cnblogs.com/wadexia/p/ThreadPool.html
Copyright © 2011-2022 走看看