
关于C++线程池的问题,高手多多指教. 10
for(inti=0;i<ThreadNum;i++){pThreadPool->ThreadsArray[i]=CreateThread(NULL,0,WorkerTh...
for(int i=0; i<ThreadNum; i++)
{
pThreadPool->ThreadsArray[i] = CreateThread(NULL, 0, WorkerThread, pThreadPool, 0, NULL);
}
这个代码创建民多个线程,但是执行了多次WorkerThread()函数,但是如何知道这些线程句柄那个是空闲的,那些是忙碌的.在从工作队列中取到item时,如何启动空闲的线程呢,如何通过句柄执行对应的线程函数呢? 展开
{
pThreadPool->ThreadsArray[i] = CreateThread(NULL, 0, WorkerThread, pThreadPool, 0, NULL);
}
这个代码创建民多个线程,但是执行了多次WorkerThread()函数,但是如何知道这些线程句柄那个是空闲的,那些是忙碌的.在从工作队列中取到item时,如何启动空闲的线程呢,如何通过句柄执行对应的线程函数呢? 展开
1个回答
展开全部
这个涉及到线程的同步,以及线程之间的通讯。这个有很多种解决方案。
1. 使用管道。 线程池里面线程在管道上同步读。然后管理线程可以通过管道给工作线程分发任务。 参考http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780(v=vs.85).aspx
2. 其他 信号量同步加 队列等。
3. 不过你这个Windows平台的话,最好的应该是 使用完成端口的办法。 系统会自己帮你管理线程池。一两句说不清楚,自己参考 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx 或者 在网上搜索一下 “c++ 完成端口” 了
1. 使用管道。 线程池里面线程在管道上同步读。然后管理线程可以通过管道给工作线程分发任务。 参考http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780(v=vs.85).aspx
2. 其他 信号量同步加 队列等。
3. 不过你这个Windows平台的话,最好的应该是 使用完成端口的办法。 系统会自己帮你管理线程池。一两句说不清楚,自己参考 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx 或者 在网上搜索一下 “c++ 完成端口” 了
更多追问追答
追问
咱先不考虑同步与通信的问题.看这个代码.
for(int i=0; iThreadsArray[i] = CreateThread(NULL, 0, WorkerThread, pThreadPool, 0, NULL);
}
如果: ThreadNum=100,那么,就创建了100个线程,就调用了100次 WorkerThread 函数.
通过标志我可以知道这100个句柄那些是忙碌的,但是从队列中取出任务之后,我如何用这个回调函数来对这100个任务执行不同的操作呢?
追答
所以告诉你要做线程同步这些嘛,
可以在WorkerThread 函数里面做完事情后,调用下面这些函数休眠等待新任务通知
1. 管道啊,信号量
WaitForSingleObject
2 . 完成端口
GetQueuedCompletionStatus
然后管理线程,要把任务分给线程池里面的线程时,可以通过,SetEvent, PostQueuedCompletionStatus 函数唤醒指定的线程池里面指定的休眠的线程。
休眠的线程从WaitForSingleObject ,GetQueuedCompletionStatus 这些函数返回就可以解析通知消息,根据消息内容确定要执行什么任务,然后继续下一个循环。
你先到MSDN里面查看在和3个函数的用法,通过这几个函数就就可以达到你的目的了。
CreateIoCompletionPort
GetQueuedCompletionStatus
PostQueuedCompletionStatus
然后自己在网上搜索一下,相关的“Windows完成端口” 方面的网页,都大概浏览一下,如果死实在不行再回来提问。我想大多数人都是只能告诉你一个方向而已。自己学习过程可能收获也更大一些。如果一下子帮你弄个完整的代码出来那也没什么意思。其实你有要的这种功能,c++里面也有比较高级的封装好的库可以使用的,比较asio之类的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询