muduo庫中對線程池的實現(1)

在學muduo庫之前,我只知道一點線程池的概念,但是對於怎麼實現線程池完全不瞭解,最近因爲被分配到了一個實驗室裏項目小組,於是開始學習muduo庫。

在看了幾遍muduo庫中的ThreadPool線程池類的實現之後,感覺對線程池有了一些瞭解,就簡單對muduo庫是如何實現線程池做一些簡單的說明,順便加深一下記憶。


前置知識:

1. linux下線程的創建使用
2. 線程鎖的初步瞭解
3. 線程條件變量的初步瞭解

實現思路:

1. 聲明一個任務列表(std::dequeue<boost::function<void()>> queue_;),定義一個接口給外部傳遞任務進來(任務類型是函數指針)

2. 定義兩個線程用條件變量:
Condition notEmpty;
Condition notFull;
     notEmpty 用來告知線程池裏面的線程當前是否有尚未執行的任務(即任務列表是否空)
     notFull 用來告知傳遞任務的線程當前線程池的任務列表是否已經塞滿

3. 定義一個函數給線程池裏的線程來運行,該函數主要的作用是抓取任務列表中的任務
    因爲任務是函數指針(其實是boost::function),所以當抓取到任務後直接運行抓取到的任務函數就好了,運行好之後會返回,開始下一輪的抓取,並通知其他線程自己已經空閒了。

muduo::ThreadPool類的使用

/*********************************************************
 * Author           : crazy_mad
 * Last modified    : 2017-04-13 21:19
 * Filename         : main.cc
 * Description      : 測試muduo中的ThreadPool線程池
 *********************************************************/

#include <muduo/base/ThreadPool.h>
#include <boost/bind.hpp>

#include <iostream>
#include <string>

#include <stdio.h>
#include <unistd.h>
#include <time.h>

using namespace std;
using namespace muduo;

void say_1() {
	cout << "this is say_1" << endl;
}

void say_2(std::string line) {
	cout << line << endl;
}	

int main() {
	ThreadPool pool_("crazymad's pool");
	pool_.setMaxQueueSize(10);	// 設置任務列表容量
	pool_.start(2);				// 開啓兩個線程
	pool_.run(say_1);			// 傳入任務
	pool_.run(boost::bind(say_2, std::string("hello world")));
	pool_.run(boost::bind(say_2, std::string("crazy_mad很帥")));
	sleep(1);				// ThreadPool沒有等待子線程運行完畢的機制,這裏爲了方便就手動等一秒鐘好了

	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章