标签:style blog http color os ar for 文件 sp
我们封装好了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*/
接下来,我们需要实现声明中的函数,构造函数中,我们需要将两个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 }
在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 }
编译时要注意,需要的各个cpp文件在前面几篇文章中已经列出,请自行下载尝试。
标签:style blog http color os ar for 文件 sp
原文地址:http://www.cnblogs.com/gjn135120/p/4009444.html