线程池 | 测试代码

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
#include"threadpool.h"

#include<chrono>

using namespace std;

/*
有些场景是希望能够获取线程执行任务的返回值的
举例:
1+.....+30000的和

thread1 1+..+10000
thread2 10001+...+20000
....

main thread:给每个线程分配计算的区间,并等待算完的结果最后合并

*/

class MyTask :public Task
{
public:
MyTask(int begin,int end)
:begin_(begin),end_(end){}
//问题1:怎么设计run函数的返回值,可以表示任意的类型呢?
Any run()
{
std::cout << "tid:" << std::this_thread::get_id() <<"begin!" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(20));
int sum = 0;
for (int i = begin_; i <= end_; i++)
sum += i;

std::cout << "tid:"<< std::this_thread::get_id() << "end!" << std::endl;
return sum;
}

private:
int begin_;
int end_;
};

int main()
{
/*
{
ThreadPool pool;
pool.setMode(PoolMode::MODE_CACHED);
pool.start(4);

Result res1 = pool.submitTask(std::make_shared<MyTask>(1, 100));
Result res2 = pool.submitTask(std::make_shared<MyTask>(101, 200));
Result res3 = pool.submitTask(std::make_shared<MyTask>(201, 300));
pool.submitTask(std::make_shared<MyTask>(201, 300));
pool.submitTask(std::make_shared<MyTask>(201, 300));
pool.submitTask(std::make_shared<MyTask>(201, 300));
int sum1 = res1.get().cast_<int>();
int sum2 = res2.get().cast_<int>();
int sum3 = res3.get().cast_<int>();

//Master-Slave线程模型
//Master线程用来分解任务,然后给各个Salve线程分配任务
//等待各个Slave线程执行完任务,返回结果
//Master线程合并各个任务结果,输出

std::cout << "最后结果:" << (sum1 + sum2 + sum3) << std::endl;
}
//pool.submitTask(std::make_shared<MyTask>());
//pool.submitTask(std::make_shared<MyTask>());
//pool.submitTask(std::make_shared<MyTask>());
//主线程结束过快会导致没有测试的现象,因为我们把线程分离了,各自执行各自的内容.
//std::this_thread::sleep_for(std::chrono::seconds(5));
getchar();


*/
{
ThreadPool pool;
pool.setMode(PoolMode::MODE_CACHED);
pool.start(2);

Result res1 = pool.submitTask(std::make_shared<MyTask>(1, 100));

Result res2 = pool.submitTask(std::make_shared<MyTask>(1, 100));
Result res3 = pool.submitTask(std::make_shared<MyTask>(1, 100));
Result res4 = pool.submitTask(std::make_shared<MyTask>(1, 100));
Result res5 = pool.submitTask(std::make_shared<MyTask>(1, 100));
//int sum1 = res1.get().cast_<int>();
//std::cout << "最后结果:" << sum1 << std::endl;
}
std::cout << "main over" << std::endl;

getchar();
return 0;

}