首页 > 代码库 > Linux组件封装(五) WorkShop的封装

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

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

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

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

声明代码如下:

 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代码如下:

 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()函数将每个线程关闭。

测试代码如下:

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的封装