github地址:https://github.com/progschj/ThreadPool
行38 vector emplace_back() 直接在容器内部构造对象。避免生成临时对象。 后面接一个lambda表达式。 正确写法应该是 thread([] () -> {}); 这里没用thread包裹,也许是emplace_back()的原因吧。
行45 - 行53 unique_lock 适配 condition_variable ,unique_lock 构造对象时会加锁, condition_variable wait时会解锁,然后等待通知信号。这样 行74 不会阻塞, wait跟一个 lambda,会避免 notify_one()信号丢失。详情参考c++11 条件变量condition_variable的解释。std::move避免拷贝。语句块结束,资源释放,执行任务。 此时线程对象构造完成,线程开始运行。循环锁住,等待通知,执行任务。
行63 enqueue函数用了返回类型后置, 变长参数模板。future,result_of类。
行68 make_shared 共享指针。packaged_task() 函数包裹器,<>里面填函数形式,构造函数参数传入函数。std::bind把多参数函数转化成少参数函数,或者无参数函数(bind的精髓).
行80 把任务lambda表达式推入任务队列。 唤醒一个工作线程执行任务。返回feature便于客户端同步。这想法,太特么牛逼了,不仅能拿到返回值,还能实现数据的同步操作。
行87 析构函数。 修改状态,唤醒所有线程,等待线程结束。资源回收。