1前言
乙個後台實時處理的業務平台,通常我們會根據資料的輸入與輸出,依據時間軸進行分解成不同階段或不同粒度的邏輯任務,而每乙個待處理的資料我們稱為任務或者訊息。任務之間的關係可以分為兩類:a 上下游父子關係,b 可以並行執行的兄弟關係。具有上下游關係的任務集合具有邏輯或資料依賴關係,即上游任務執行完後,才能執行下游任務;具有兄弟關係的任務間邏輯上互不影響,可以並行執行。
無論是上面任一情況的業務場景,我們都需要一種管理類,其職責:管理著一堆執行緒及其待執行的同型別任務集合。執行緒會等待去執行餵給它的任務,當任務集合大於執行緒集合的個數時,任務會在佇列排隊等待;而當執行緒集合個數大於任務集合時,執行緒會掛起處於阻塞等待狀態,執行器也相應地處於不飽和狀態。在jdk裡面有現成的管理類threadpoolexecutor,那麼在c++裡面看看類似的實現吧:
2任務與任務池
2.1任務
無論是訊息或業務資料,可以抽象地表達為:
struct2.2 任務池data_pair
任務的快取用佇列表達:
std::queue_queue;
2.3 任務提交入口
int cqueuethread::writedata(void *data, int3執行緒池len)
data_pair *item = new
data_pair();
item->data = (char*) malloc
(len);
assert(item->data !=null);
memcpy(item->data, data, len);
item->len =len;
_mutex.
lock
(); _queue.push(item);
_mutex.signal();
_mutex.unlock();
return
exit_success;
}
3.1 執行緒封裝
c++裡面類似jdk裡面thread類的封裝cthread
/**view code* 起乙個執行緒,開始執行
*/bool start(runnable *r, void *a)
/*** 等待執行緒退出
*/void
join()
}/**
* 得到runnable物件
** @return runnable
*/runnable *getrunnable()
/*** 得到**引數
** @return args
*/void *getargs()
/***
* 得到執行緒的程序id
*/int
getpid()
/*** 執行緒的**函式
**/static
void *hook(void *arg)
return (void*) null;
}private
:
/*** 得到tid號
*/#ifdef _syscall0
static
_syscall0(pid_t,gettid)
#else
static pid_t gettid()
#endif
private
: pthread_t tid;
//pthread_self() id
int pid; //
執行緒的程序id
runnable *runnable;
void *args;
}; }
3.2 執行緒池
並行處理的能力有執行緒池的個數決定,定義如下:
cthread *_thread;
int _threadcount;
4執行器
4.1 執行啟動
int4.2 執行cdefaultrunnable::start()
_thread = new
cthread[_threadcount];
if (null ==_thread)
int i = 0
;
for (; i<_threadcount i>
}return
i;}
執行器包含了具體業務的執行:
void cqueuethread::run(cthread *thread, void *args)5 樣例**if(_stop)
data_pair *item =_queue.front();
_queue.pop();
_mutex.unlock();
if (item !=null)
if (item->data)
free
(item);
}_mutex.
lock
(); }
_mutex.unlock();
cmyhandler handler;cqueuethread queuethread(
3, &handler, null);
queuethread.start();
char data[1024
];for(int i=1; i<=mwritecount; i++)
queuethread.wait();
執行緒池 任務延時執行
我在做乙個匯入功能,匯入的邏輯都是呼叫的頁面介面。介面執行邏輯 將資料儲存到資料庫,然後再呼叫job任務加工歷史資料。使用者在頁面上操作是ok的,畢竟每操作一下,介面最多呼叫一次。但是匯入就不一樣了,相當於使用者一直在對著頁面點點點 這會導致後面歷史任務的加工出現問題。在匯入的時候,我需要先讓基本資...
執行緒池多工的執行順序
執行緒池場景 面試官 假設我們有乙個執行緒池,核心執行緒數為10,最大執行緒數也為20,任務隊列為100。現在來了100個任務,執行緒池裡現在有幾個執行緒執行?粉絲豪 應該是10吧。面試官 你確定?粉絲豪 確定啊,就是10 於是乎,粉絲豪就回去等通知了 其實這道題正確的答案是 不一定!因為並沒指明是...
任務管理器
dim url systemutil.run e 20111108 20111108 chinese hedexlite.exe process name inputbox 請輸入程序名 程序 hedexlite process list dialog windows 任務管理器 winlistvi...