pthread pool,C ++

时间:2011-06-16 02:23:56

标签: c++ multithreading pthreads

我正在使用C ++开发网络程序,我想实现一个pthread池。每当我从接收套接字收到一个事件时,我都会将数据放入线程池中的队列中。我正在考虑创建5个单独的线程,并将不断检查队列以查看是否有任何传入数据要完成。

这是一个非常直接的主题,但我不是专家,所以我想听听任何可能有助于实现这一点的内容。

请让我知道我应该知道的任何教程或参考或问题。

5 个答案:

答案 0 :(得分:4)

使用Boost.Asio并让池中的每个thread调用io_service::run()

  

多个线程可能会调用   io_service :: run()来建立一个池   完成处理程序的线程   可以被调用。这种方法也可能   与io_service :: post()一起使用   一种执行任何计算的方法   跨线程池的任务。

     

请注意已加入的所有线程   考虑一个io_service的池   等价的,io_service可以   在他们中间分配工作   任意时尚。

答案 1 :(得分:1)

开始之前。
使用boost :: threads

如果你想知道如何使用pthread,那么你需要使用pthread条件变量。这些允许您在不消耗CPU的情况下挂起等待工作的线程。

当一项工作被添加到队列中时,您会发出条件变量的信号,并且将从条件变量中释放一个pthread,从而允许它从队列中获取一个项目。当线程完成处理工作项时,它返回到条件变量以等待下一个工作。

循环中线程的主循环应该如下所示;

ThreadWorkLoop()                   // The function that all the pool threads run. 
{
    while(poolRunnin)
    {
        WorkItem = getWorkItem(); // Get an item from the queue. This suspends until an item 
        WorkItem->run();          // is available then you can run it.
    }
}
GetWorkItem()
{
    Locker  lock(mutex);                // RAII: Lock/unlock mutex
    while(workQueue.size() == 0)
    {
        conditionVariable.wait(mutex);  // Waiting on a condition variable suspends a thread
    }                                   // until the condition variable is signalled.
                                        // Note: the mutex is unlocked while the thread is suspended
    return workQueue.popItem();
}
AddItemToQueue(item)
{
    Locker lock(mutex);
    workQueue.pushItem(item);
    conditionVariable.signal();        // Release a thread from the condition variable.
}

答案 2 :(得分:0)

让接收线程推送队列中的数据并弹出5个线程。使用互斥锁保护队列,让它们“争夺”数据。

您还希望在工作线程的主循环中有一个usleep()或pthread_yield()

答案 3 :(得分:0)

您需要一个互斥锁和一个条件变量。 Mutex将保护您的作业队列,当接收线程将作业添加到队列时,它将发出条件变量的信号。工作线程将等待条件变量,并在发出信号时唤醒。

答案 4 :(得分:0)

Boost asio是一个很好的解决方案。

但如果您不想使用它(或因某些原因无法使用它),那么您可能希望使用基于信号量的实现。

您可以在此处使用基于信号量的多线程队列实现:

https://gist.github.com/482342

使用信号量的原因是你可以避免工作线程不断轮询,而是在有工作要做的时候让操作系统唤醒它们。