• 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, new Producer(_buffer)),
    11      _consumers(_consumerSize, new Consumer(_buffer))
    12 {
    13 
    14 }
    15 
    16 WorkShop::~WorkShop()
    17 {
    18     for(std::vector<Producer *>::iterator iter = _producers.begin();
    19         iter != _producers.end();
    20         ++ iter)
    21         delete *iter;
    22 
    23     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
    24         iter != _consumers.end();
    25         ++ iter)
    26         delete *iter;
    27 }
    28 
    29 void WorkShop::startWork()
    30 {
    31     for(std::vector<Producer *>::iterator iter = _producers.begin();
    32         iter != _producers.end();
    33         ++ iter)
    34         (*iter)->start();
    35 
    36     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
    37         iter != _consumers.end();
    38         ++ iter)
    39         (*iter)->start();
    40 
    41     for(std::vector<Producer *>::iterator iter = _producers.begin();
    42         iter != _producers.end();
    43         ++ iter)
    44         (*iter)->join();
    45 
    46     for(std::vector<Consumer *>::iterator iter = _consumers.begin();
    47         iter != _consumers.end();
    48         ++ iter)
    49         (*iter)->join();
    50 }
    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文件在前面几篇文章中已经列出,请自行下载尝试。

  • 相关阅读:
    求求你们了,别再写满屏的 try catch 了!
    你要的Netty常见面试题总结,我面试回来整理好了!
    动态代理原理剖析
    确定要面试问我JVM吗?我打算聊一个小时的!
    每天花2小时复习Java面试指南,高级架构视频,我进了阿里定级P7
    HashMap 的 7 种遍历方式与性能分析!(强烈推荐)
    太厉害了,有人把《数据结构与算法》讲透了,面试大厂不在是问题,带源码笔记!
    你敢信一个HTTP能打趴80%面试者?
    MySQL硬核干货:从磁盘读取数据页到缓冲池时,免费链表有什么用?
    权限管理模块设计
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4009444.html
Copyright © 2020-2023  润新知