当前位置: 首页 > news >正文

建视频网站多少钱如何让自己的网站被百度收录

建视频网站多少钱,如何让自己的网站被百度收录,b2b做外贸网站,网站域名备案信息查询概要 通常线程池是同质的,每个线程都可以执行任意的task(每个线程中的task顺序执行),如下图所示: 但本文所介绍的线程和task之间有绑定关系,如A task只能跑在A thread上(因此称为异构线程池&am…

概要

通常线程池是同质的,每个线程都可以执行任意的task(每个线程中的task顺序执行),如下图所示:

 但本文所介绍的线程和task之间有绑定关系,如A task只能跑在A thread上(因此称为异构线程池,每个线程的功能是有所区别的),如下图所示:

接口设计

TThreadPool接口设计

// 线程池
class TThreadPool
{
public:TThreadPool() {}TThreadPool(const TThreadPool&) = delete;TThreadPool& operator=(const TThreadPool& other) = delete;~TThreadPool();bool add_thread(std::string name); // add one thread into poolbool delete_thread(std::string name); // remove one thread from poolTThread* get_thread_by_name(std::string threadname); // get the thread by name, don't delete return object by yourselfbool append_task_by_thread(const std::string threadname, const std::function<void()>& task); // add task to pointed threadprivate:std::mutex m_mutex;std::map<std::string, TThread*> m_threads;
};

 TThreadPool类的主要功能是管理创建的线程(TThread,它是线程的具体实现),它提供了增加/删除线程的接口,同时给每个线程打上了标签(name)。

TThread接口设计

// 对std::thread的封装类
class TThread
{
public:TThread(std::string name);TThread(const TThread& other) = delete;TThread& operator=(const TThread& other) = delete;~TThread();bool push_task(const std::function<void()>& task); // one add taskstd::thread::id get_thread_id(); // for log purposevoid set_max_task_size(int s); // avoid thread too busyint get_task_size(); // get current task numberprivate:void work(); // real work threadvoid notify(); // notify work thread to quit
private:std::string s_name;std::atomic_bool b_running;std::thread* p_thread;std::mutex m_mutex;std::queue<std::function<void()> > m_tasks;std::condition_variable m_cond;std::atomic<int> i_maxTaskSize;
};

TThread类的主要功能是分配任务(push_task函数)和处理任务(work函数)。

代码实现

TThreadPool类

TThreadPool::~TThreadPool() {std::unique_lock<std::mutex> lk(m_mutex);for(auto iter=m_threads.begin(); iter!=m_threads.end(); iter++) {if(iter->second != nullptr) {delete iter->second;}}m_threads.clear();
}bool TThreadPool::add_thread(std::string name) {std::unique_lock<std::mutex> lk(m_mutex);if(m_threads.count(name)) {return false;}auto tt = new TThread(name);if(tt == nullptr) {return false;}m_threads[name] = tt;return true;
}bool TThreadPool::delete_thread(std::string name) {std::unique_lock<std::mutex> lk(m_mutex);if(m_threads.count(name) == 0) {return false;}delete m_threads[name];m_threads.erase(name);return true;
}TThread* TThreadPool::get_thread_by_name(std::string threadname) {std::unique_lock<std::mutex> lk(m_mutex);if(m_threads.count(threadname) == 0) {return nullptr;}return m_threads[threadname];
}bool TThreadPool::append_task_by_thread(const std::string threadname, const std::function<void()>& task)
{std::unique_lock<std::mutex> lk(m_mutex);if(m_threads.count(threadname) == 0) {return false;}auto tt = m_threads[threadname];return tt->push_task(task);
}

TThread类

const int MAX_TASK_SIZE = 100; // max task size in one threadTThread::TThread(std::string name) : s_name(name), b_running(true), i_maxTaskSize(MAX_TASK_SIZE) {p_thread = new std::thread(&TThread::work, this);
}TThread::~TThread() {notify(); // notify work thread quitif(p_thread->joinable()) {p_thread->join();}delete p_thread;
}bool TThread::push_task(const std::function<void()>& task) {std::unique_lock<std::mutex> lk(m_mutex);if(!b_running) {return false;}if(m_tasks.size() > i_maxTaskSize.load()) {return false;}m_tasks.push(task);m_cond.notify_one();return true;
}std::thread::id TThread::get_thread_id() {return p_thread->get_id();
}void TThread::set_max_task_size(int s) {if(s <= 0) {return;}i_maxTaskSize.store(s);
}void TThread::work() {std::cout << std::this_thread::get_id() << " begin work thread" << std::endl;while (b_running) { // quit even tasks remainingstd::function<void()> task;{std::unique_lock<std::mutex> lk(m_mutex);if (!m_tasks.empty()) {task = m_tasks.front();m_tasks.pop();} else if (b_running && m_tasks.empty()) {m_cond.wait(lk);}}if (task)task(); // do the task}std::cout << std::this_thread::get_id() << " end work thread"  << std::endl;
}void TThread::notify() {std::unique_lock<std::mutex> lk(m_mutex);b_running = false;m_cond.notify_one(); // mutex will be released here, therefore another thread would lock it afterward
}int TThread::get_task_size() {std::unique_lock<std::mutex> lk(m_mutex);return m_tasks.size();
}

使用方式

有两种方式可以调用对应的线程

公共代码

void func1(int i) {std::cout << "into func1: " << i << std::endl;sleep(2); // simulate real work
}TThreadPool thread_pool;thread_pool.add_thread("vdr"); // 启动vdr线程thread_pool.add_thread("xgb"); // 启动xgb线程

方式一、(先获取线程对象,然后对该线程对象添加任务)

auto tt = thread_pool.getThreadByName("vdr");
tt->push_task(std::bind(func1, 2));
tt->push_task(std::bind(func1, 5));

方式二、(直接通过线程池给对应线程添加任务)

thread_pool.append_task_by_thread("vdr", std::bind(func1, 2));
thread_pool.append_task_by_thread("vdr", std::bind(func1, 5));

注:

task是std::function<void()>类型,上面的demo是普通函数实现的,真实场景应该是类函数,实现如下:

class A {
public:void func(std::string str) {std::cout << "into A func: " << str << std::endl;}
};A a;thread_pool.append_task_by_thread("vdr", std::bind(&A::func, &a, "2"));thread_pool.append_task_by_thread("vdr", std::bind(&A::func, &a, "5"));

http://www.khdw.cn/news/15030.html

相关文章:

  • 做一个响应网站多少钱免费的拓客平台有哪些
  • 办个人网站租空间个人免费建站软件
  • 门户型网站开发难度广告投放运营主要做什么
  • 邹城哪个公司做网站好网站营销
  • 手机网站设计公司哪家专业百度app手机版
  • python 网站开发 环境十大免费引流平台
  • 淘客网站难做吗快手seo
  • 微信小程序店铺开通要多少钱app优化
  • wordpress制作图片站优化大师平台
  • 建设wap手机网站制作网络推广工作内容
  • 网站建设优化加盟代理seo链接优化
  • 网站app下载平台怎么做的个人网站设计作品
  • 摄影网站开发的背景深圳市企业网站seo营销工具
  • 做游戏下载网站赚钱优化seo
  • 网站源码在线下载奇零seo赚钱培训
  • 各大网站黑白几天今天的新闻 联播最新消息
  • 网页设计与网站建设教学视频信息流推广
  • 备案 网站名称 怎么改最近最新新闻
  • 管理技巧与方法如何优化关键词排名到首页
  • 手机网站建设 移商动力重庆seo黄智
  • 呼和浩特免费制作网站seo关键词排名优化销售
  • 湖北省建设信息网官网广州宣布5条优化措施
  • 济南网站建设哪家好建网站公司哪里好
  • 做暧昧免费视频大全网站成都seo网络优化公司
  • 如何做网站关键字优化哈尔滨关键词优化报价
  • 上海网站建设价沈阳网站关键词优化公司
  • 广西住房与城乡建设部网站近期时政热点新闻20条
  • 怎样黑网站seo网站设计
  • 做网站的时候表格怎么去掉广西网站seo
  • 德州做网站公司怎么制作网页里面的内容