博文

目前显示的是 五月, 2018的博文

异步执行task的时候,一定要把完成通知放在最末尾的地方

请看下面这段示例代码。这段程序的目的是计算1*2+3*4+5*6=? 。它试图并行的计算3个乘法,然后汇总。如果乘号的两边是大矩阵或者向量,这样的多线程计算会得到很好的加速。
#include <atomic> #include <condition_variable> #include <mutex> #include <pthread.h> #include <stdio.h> #include <thread> #include <unistd.h> #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName &) = delete; \ void operator=(const TypeName &) = delete class SubTask; void *runSubTask(void *); class Job { public: Job() {} void compute(); void onSubTaskFinished() { if (--active_tasks == 0) { cv_.notify_all(); } } std::atomic<size_t> active_tasks; private: std::mutex m_; std::condition_variable cv_; DISALLOW_COPY_AND_ASSIGN(Job); }; class SubTask { public: int v1; int v2; std::atomic<int> *result; Job *parent; int task_id; ~SubTask() { printf("Sub task %d finished\n", task_id); } //BUG!…