今天写了一个线程安全的任务队列,记录一下,直接上代码:
class TaskQueue{
private:
using Task = std::function<void(int args)>;
void put(Task task) {
std::lock_guard<std::mutex> l(lock_);
queue_.push_back(task);
cond_.notify_all();
}
Task get() {
std::unique_lock<std::mutex> l(lock_);
cond_.wait(l, [this] {return !queue_.empty()});
auto task = queue_.front;
queue_.pop_front();
return task;
}
private:
std::deque<Task> queue_;
std::mutex lock_;
std::condition_variable cond_;
}
有些线程安全的队列之后,就可以把一些任务放入队列里,然后创建几个线程,不断去线程队列里面取出任务执行:
创建任务队列实例后:TaskQueue task_queue;
for (int i = 0; i < thread_num; ++i) {
std::thread([&] {
prctl(PR_SET_NAME, "task thread");
while (true) {
auto task = task_queue.get();
task(args);
}
}).detach();
}
如果有一个请求,分成了很多互不干扰的task,放入了队列里,那么该请求的这些task怎么做同步呢?那就需要一个同步机制,请听下回分享。