码迷,mamicode.com
首页 > 系统相关 > 详细

Linux组件封装(五) WorkShop的封装

时间:2014-10-07 17:47:43      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   ar   for   文件   sp   

我们封装好了Buffer后,却不知道具体要多少个线程,一个一个线程的去关联Buffer太繁琐了。

那么,我们是不是可以讲Buffer与线程的一个队列封装在一起呢 ?

由于vector中不能存放Thread,所以,我们应在vector中添加相应的Thread *,这样,就可以完成封装了。

声明代码如下:

bubuko.com,布布扣
 1 #ifndef WORKSHOP_H
 2 #define WORKSHOP_H
 3 #include "NonCopyable.h"
 4 #include "Buffer.h"
 5 #include <vector>
 6 class Producer;
 7 class Consumer;
 8 class WorkShop : NonCopyable
 9 {
10 public:
11     WorkShop(size_t bufferSize, size_t producerSize, size_t consumerSize);
12 
13     ~WorkShop();
14     void startWork();
15 private:
16 
17     size_t _bufferSize;
18 
19     Buffer _buffer;
20     size_t _producerSize;
21     size_t _consumerSize;
22 
23     std::vector<Producer *> _producers;
24     std::vector<Consumer *> _consumers;
25 };
26 
27 
28 #endif  /*WORKSHOP_H*/
View Code

接下来,我们需要实现声明中的函数,构造函数中,我们需要将两个vector中的指针初始化,将该vector的大小初始化为我们得到的vector大小,将每个指针初始化为NULL, 接下来,我们需要为每个指针new一个Thread对象,这样,就完成了初始化。

同样的,当我们析构的时候,也应该将vector中的指针delete掉。

cpp代码如下:

bubuko.com,布布扣
 1 #include "WorkShop.h"
 2 #include "Producer.h"
 3 #include "Consumer.h"
 4 
 5 WorkShop::WorkShop(size_t bufferSize, size_t producerSize, size_t consumerSize)
 6     :_bufferSize(bufferSize),
 7      _buffer(_bufferSize),
 8      _producerSize(producerSize),
 9      _consumerSize(consumerSize),
10      _producers(_producerSize, NULL),
11      _consumers(_consumerSize, NULL)
12 {
13     for(std::vector<Producer *>::iterator iter = _producers.begin();
14         iter != _producers.end();
15         ++ iter)
16         *iter = new Producer(_buffer);
17 
18     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
19         iter != _consumers.end();
20         ++ iter)
21         *iter = new Consumer(_buffer);
22 }
23 
24 WorkShop::~WorkShop()
25 {
26     for(std::vector<Producer *>::iterator iter = _producers.begin();
27         iter != _producers.end();
28         ++ iter)
29         delete *iter;
30 
31     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
32         iter != _consumers.end();
33         ++ iter)
34         delete *iter;
35 }
36 
37 void WorkShop::startWork()
38 {
39     for(std::vector<Producer *>::iterator iter = _producers.begin();
40         iter != _producers.end();
41         ++ iter)
42         (*iter)->start();
43 
44     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
45         iter != _consumers.end();
46         ++ iter)
47         (*iter)->start();
48 
49     for(std::vector<Producer *>::iterator iter = _producers.begin();
50         iter != _producers.end();
51         ++ iter)
52         (*iter)->join();
53 
54     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
55         iter != _consumers.end();
56         ++ iter)
57         (*iter)->join();
58 }
View Code

在startWork函数中, 我们先将每个线程的指针调用start()函数,将线程开启, 当我们退出进程后,再调用join()函数将每个线程关闭。

测试代码如下:

bubuko.com,布布扣
1 #include "WorkShop.h"
2 
3 int main(int argc, const char *argv[])
4 {
5     WorkShop a(5, 10, 15);
6     a.startWork();
7     return 0;
8 }
View Code

编译时要注意,需要的各个cpp文件在前面几篇文章中已经列出,请自行下载尝试。

Linux组件封装(五) WorkShop的封装

标签:style   blog   http   color   os   ar   for   文件   sp   

原文地址:http://www.cnblogs.com/gjn135120/p/4009444.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!