ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

xuexi

2021-07-21 18:32:43  阅读:181  来源: 互联网

标签:std task name xuexi lock void tm


 

#include <iostream>
#include <mutex>
#include <thread>
#include <memory>
#include <vector>
#include <string>

class context
{

public:
  virtual int run() = 0;
};

class TaskManager
{
private:
  std::mutex mtx;
  std::condition_variable cond;

  std::thread m_handle;

  std::thread::id thread_id;
  bool stopped;
  std::string thread_name;

private:
  virtual void entry();
  std::vector<std::shared_ptr<context>> task;

  void _process(std::vector<std::shared_ptr<context>> &);

public:
  void create(const std::string &name)
  {
    thread_name = name;
    m_handle = std::thread(&TaskManager::entry, this);
    thread_id = m_handle.get_id();
  }

  void join()
  {
    if (m_handle.joinable())
      m_handle.join();
  }
  void detach()
  {
    m_handle.detach();
  }
  int add_task(std::shared_ptr<context>);
  void stop()
  {
    std::lock_guard<std::mutex> lock{mtx};
    stopped = true;
    cond.notify_all();
  }
};

void TaskManager::entry()
{
  while (!stopped || !task.empty())
  {
    std::unique_lock<std::mutex> lock{mtx};
    cond.wait(lock, [this]() { return (!task.empty() || stopped); });
    std::vector<std::shared_ptr<context>> tmp;
    tmp.swap(task);
    lock.unlock();
    _process(tmp);
  }
}

void TaskManager::_process(std::vector<std::shared_ptr<context>> &tsk)
{
  for (const auto &tk : tsk)
  {
    tk->run();
  }
}

int TaskManager::add_task(std::shared_ptr<context> ts)
{
  if (stopped)
    return -1;
  {
    std::lock_guard<std::mutex> lock{mtx};
    task.push_back(ts);
    cond.notify_all();
  }
  return 0;
}

class test : public context
{
private:
  std::string name;

public:
  test(const std::string &name) : name(name) {}
  int run() override
  {
    std::cout << "Task Run: " << name << std::endl;
    return 0;
  }
};

int main(int argc, char *argv[])
{
  std::shared_ptr<TaskManager> tm = std::make_shared<TaskManager>();
  tm->create("TaskManager");
  tm->add_task(std::make_shared<test>("TaskA"));
  tm->add_task(std::make_shared<test>("TaskB"));
  tm->add_task(std::make_shared<test>(std::string("TaskC")));
  tm->stop();
  tm->join();
}

 

标签:std,task,name,xuexi,lock,void,tm
来源: https://www.cnblogs.com/sunbines/p/15040859.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有