我正在使用C ++开发网络程序,我想实现一个pthread池。每当我从接收套接字收到一个事件时,我都会将数据放入线程池中的队列中。我正在考虑创建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
使用信号量的原因是你可以避免工作线程不断轮询,而是在有工作要做的时候让操作系统唤醒它们。