libuvを使用して生産者と消費者モデルを実現

2802 ワード

生産者と消費者モデル(Consumer+Producer model)
時間のかかる操作(本番スレッド)を1つ以上の追加スレッドに割り当てて実行(消費スレッド)し、本番スレッドの応答速度(同時能力)を向上させるために使用します.
 
定義#テイギ#
1 typedef std::unique_ptr<Work> WorkPtr;

2 std::queue<WorkPtr> work_queue;

3 uv_mutex_t mutex;

4 uv_cond_t cond;

プロダクション
1 //adding new work

2 WorkPtr newWork(new Work);

3 uv_mutex_lock(&mutex);

4 work_queue.push(std::move(new_work));

5 uv_cond_signal(&cond);

6 uv_mutex_unlock(&mutex);

消費
 1 while(true)

 2 {

 3   //copying work that has to be done

 4   uv_mutex_lock(&mutex);

 5   while(work_queue.empty())

 6   {

 7     uv_cond_wait(&cv, &mutex);

 8   }

 9   WorkPtr work;

10   work.swap(work_queue.front());

11   work_queue.pop();

12   uv_mutex_unlock(&mutex);

13   //doing work ...

14 }