-
Notifications
You must be signed in to change notification settings - Fork 4
/
ThreadPool.cpp
97 lines (77 loc) · 1.85 KB
/
ThreadPool.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
* File: ThreadPool.cpp
* Author: Administrator
*
* Created on 2014年1月24日, 上午10:04
*/
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include "ThreadPool.h"
#include "Semaphore.h"
namespace CommLib {
ThreadPool::ThreadPool() : bRuning_(false) ,sem_(0,0){
}
ThreadPool::~ThreadPool() {
ClearTaskList();
Stop();
}
void ThreadPool::AddTask(boost::function<void () > func) {
{
CAutoLock al(lock_);
tasklist_.push_back(func);
}
sem_.post();
}
int ThreadPool::GetCurrTaskSize() {
CAutoLock al(lock_);
return tasklist_.size();
}
bool ThreadPool::PopTask(boost::function<void () >& func) {
sem_.wait();
CAutoLock al(lock_);
if (!tasklist_.empty()) {
func = tasklist_.front();
tasklist_.pop_front();
return true;
} else
return false;
}
void ThreadPool::ThreadFunc() {
while ( bRunning() ) {
boost::function<void () > func;
while (PopTask(func)) {
func();
}
}
}
bool ThreadPool::Init(int threadCnt) {
CAutoLock al(lockOp_);
if ((!bRuning_) &&(threadCnt < MAX_THREADPOOLSIZE)) {
threadvec_.resize(threadCnt);
bRuning_ = true;
for (int i = 0; i < threadCnt; i++) {
threadvec_[i] = new Thread( boost::bind(&ThreadPool::ThreadFunc, this),"");
threadvec_[i]->StartThread();
}
return true;
}
return false;
}
void ThreadPool::Stop() {
CAutoLock al(lockOp_);
if (bRuning_) {
bRuning_ = false;
// con_.Broadcast();
int threadCnt = threadvec_.size();
for(int i = 0; i < threadCnt; i++)
{
sem_.post();
}
for (int i = 0; i < threadCnt; i++) {
threadvec_[i]->Join();
delete threadvec_[i];
}
threadvec_.clear();
}
}
}