【发布时间】:2018-01-15 13:30:19
【问题描述】:
我正在VS2015 上开发一个C++14 Windows DLL,它可以在所有Windows 版本>= XP 上运行。
TL;DR
使用CreateEvent 创建的事件数量是否有限制,当然名称不同?
背景
我正在编写一个线程池类。 类接口很简单:
void AddTask(std::function<void()> task);
任务被添加到任务队列中,等待的工作人员 (vector <thread>) 在可用时激活任务。
要求
在继续流程之前等待(阻塞)一点任务。这意味着,ThreadPool 的某些用户在调用AddTask 之后可能希望等待一段时间(比如 1 秒)让任务结束,然后再继续流程。如果任务还没有完成,他们仍然会继续流程。
问题
ThreadPool 类不能提供Wait 接口。不是它的责任。
解决方案
-
任务完成后
ThreadPool将SetEvent。 -
ThreadPool的用户将等待(或不等待。取决于他们的需要)等待事件发出信号。
所以,我将ThreadPool::AddTask 的返回值从void 更改为int,其中int 是唯一的任务ID,它本质上是任务完成时要单选的事件的名称。
问题
我预计任务不会超过 500 个,但恐怕创建数百个事件是不可能的,甚至是不好的做法。
那么有限制吗?还是更好的方法?
【问题讨论】:
-
如果您确实采用事件方法,那么从
AddTask返回一个HANDLE(或一些 RAII 包装的对象)而不是返回一个模棱两可的int不是更有意义吗?不多说?这样,您可以立即等待任务,而不是在某些int地图中寻找事件.. -
@David 是对的,这更有意义。这样,您可以使用未命名的事件,这样会更有效率。
-
我实际上已经更改了函数以返回要发出信号的事件名称。 (将)处理任务的句柄(工作人员)在
AddTask范围内未确定,因此我无法返回它。我可以返回事件本身而不是事件名称。 -
@idanshmu 所以你可以或不能返回一个句柄?不清楚。
-
我不能返回 线程
HANDLE。但是,我可以预先分配一个Event,然后可以返回它的HANDLE。但需要ThreadPool维护任务到事件HANDLE的映射
标签: c++ windows multithreading events threadpool