Win32下线程池实现

来源:互联网 发布:矩阵分析引论课后答案 编辑:程序博客网 时间:2024/04/30 18:45

 

关于线程池的原理及java实现,我在http://shallway.net/?p=109 有写过。我现在只是讨论下Win32下的线程池,道理一个样。

当然,除了自己实现线程池,更建议使用官方的线程池库,比如java的Executors,Windows下的ThreadPoll API(具体可查阅windows核心编程第11章),但是Windows下的线程池API只支持VISTA以上版本。。

一开始我就说过,个人不太喜欢程序里到处布满杂乱的WINDOWS API,所以仿照http://shallway.net/?p=109 ,我写了个windows下的线程池。至少经测试没有同步错误,但是效率可能差点。:)

线程池的关键就是BlockingQueue的实现,有了它后自己再创建一堆线程阻塞在上面就OK。

懒得整理了。。。我就直接搬NetWay的相关代码了。。。下面是BlockingQueue的核心实现,虽然代码不全,但是很容易还原成完整的类的,需要完整代码的课查阅NetWay源码。。。

#include "EventQueue.h"
#include

void EventQueue::enqueue(std::string e)
{
    mutex.Lock();
    events.push_back(e);
   
   
    PulseEvent(hEventObject);

    mutex.Unlock();
}

EventQueue::EventQueue(const std::string &name)
{
    hEventObject = CreateEventA(NULL,      // Security
                               FALSE,                     // Automatic (FALSE = not manual)
                               0,                           // Clear on creation
                               name.data());          // Name of object
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        exit(0);
    }
}

std::string EventQueue::dequeue()
{
    std::string e;

TT:

    while(events.size() == 0 )

    {
         WaitForSingleObject(hEventObject, INFINITE);
         
    }
    mutex.Lock();
   
    if(events.size() != 0)
    {
        e = events.front();
        events.pop_front();
    }

    else
    {
        mutex.Unlock();
        goto TT;
    }
    mutex.Unlock();

    return e;

   
}

int EventQueue::size()
{
    mutex.Lock();

    int len = events.size();

    mutex.Unlock();

    return len;
}

EventQueue::~EventQueue()
{
    CloseHandle(hEventObject);
}

 

以上代码假设BlockingQueue存储的是string对象。。还有用到了goto。。实在万不得已,要不会有同步错误。。

原创粉丝点击