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

设计b2c网站建设互联网广告平台排名

设计b2c网站建设,互联网广告平台排名,网站前端后端分开做可以吗,动态网站开发常见语言1. 线程池要求 我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C 的类内包装原生线程库的形式来创建,其具体实行逻辑如图 可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它 2. 整体模板 #pragma …

1. 线程池要求

我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C++ 的类内包装原生线程库的形式来创建,其具体实行逻辑如图

可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它

2. 整体模板

#pragma once#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <pthread.h>struct ThreadInfo
{pthread_t tid;std::string name;
};static const int defalutnum = 5;template<class T>
class ThreadPool
{
public:ThreadPoo1(int num = defalutnum):threads_(num){pthread_mutex_init(&mutex_, nullptr);pthread_cond_init(&cond_, nullptr);}~ThreadPoo1(){pthread_mutex_destroy(&mutex_);pthread_mutex_destroy(&cond_);}
private:std::vector<ThreadInfo> threads_;std::queue<T>tasks_;pthread_mutex_t mutex_;pthread_cond_t cond_;
};

3. 具体实现

#pragma once#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <pthread.h>// 存储线程池中各个线程信息
struct ThreadInfo
{pthread_t tid;std::string name;
};// 默认线程池容量
static const int defalutnum = 5;template<class T>
class ThreadPool
{
private:// 加锁void Lock(){pthread_mutex_lock(&mutex_);}// 释放锁void Unlock(){pthread_mutex_unlock (&mutex_);}// 唤醒线程void Wakeup(){pthread_cond_signal(&cond_);}// 资源不就绪, 线程同步void ThreadSleep(){pthread_cond_wait(&cond_, &mutex_);}// 对当前任务列表判空bool IsQueueEmpty(){return tasks_.size() == 0 ? true : false;}// 获取线程 namestd::string GetThreadName(pthread_t tid){for (const auto &ti : threads_){if (ti.tid == tid)return ti.name;}return "None";}
public:ThreadPool(int num = defalutnum):threads_(num){pthread_mutex_init(&mutex_, nullptr);pthread_cond_init(&cond_, nullptr);}// 由于 pthread_create 函数的特殊性// 只能将 HandlerTask 设置为静态函数// 同时将 this 指针以参数的形式传入static void *HandlerTask(void *args){ThreadPool<T> *tp = static_cast<ThreadPool<T> *>(args);while (true){// 确保同一时刻只有一个线程在进行消费tp->Lock();// 如果当前任务列表为空就让线程等待资源// 为防止伪唤醒的情况, 使用 whilewhile (tp->IsQueueEmpty()){tp->ThreadSleep();}T t = tp->Pop();tp->Unlock();// 执行任务// 注: 需要任务中重载 operator()t();}}// 启动线程池void Start(){int num = threads_.size();for (int i = 0; i < num; i++){threads_[i].name = "thread-" + std::to_string(i+1);pthread_create(&(threads_[i].tid), nullptr, HandlerTask, this);}}// Pop 函数在锁内执行因此不需要单独加锁T Pop(){T t = tasks_.front();tasks_.pop();return t;}// 将外界资源投入线程池void Push(const T &t){Lock();tasks_.push(t);Wakeup(); // 投入资源成功后唤醒线程 Unlock();}~ThreadPool(){pthread_mutex_destroy(&mutex_);pthread_cond_destroy(&cond_);}
private:std::vector<ThreadInfo> threads_; // 线程池中所有线程的信息std::queue<T> tasks_;             // 任务队列pthread_mutex_t mutex_;           // 互斥锁pthread_cond_t cond_;             // 条件变量
};

4. 使用测试

在这里我们引用一个 Task.hpp 的任务工具,如下

#pragma once#include "Log.hpp"
#include <iostream>
#include <string>std::string opers = "+-*/%";enum ErrorCode
{DevideZero,ModZero,Unknown,Normal
};class Task
{
public:Task(int x, int y, char op):a(x), b(y), op_(op) {}void operator()(){run();lg(Info, "run a task: %s", GetResult().c_str());}void run(){switch(op_){case '+':answer = a + b;break;case '-':answer = a - b;break;case '*':answer = a * b;break;case '/':if (b != 0) answer = a / b;else exitcode = DevideZero;break;case '%':if (b != 0) answer = a % b;else exitcode = ModZero;break;default:lg(Error, "Using correct operation: + - * / %");exitcode = Unknown;break;}}std::string GetTask(){std::string ret;ret += "Task: ";ret += std::to_string(a);ret += " ";ret += op_;ret += " ";ret += std::to_string(b);ret += " ";ret += "= ?";return ret;}std::string GetResult(){std::string ret;if (exitcode <= Unknown){ret += "run the task fail, reason: ";switch (exitcode){case DevideZero:ret += "DevideZero";break;case ModZero:ret += "ModZero";break;case Unknown:ret += "Unknown";break;default:break;}}else{ret += "run the task success, result: ";ret += std::to_string(a);ret += " ";ret += op_;ret += " ";ret += std::to_string(b);ret += " ";ret += "= ";ret += std::to_string(answer);}return ret;}~Task(){}private:int a;int b;char op_;int answer = 0;ErrorCode exitcode = Normal;
};

main 函数如下

#include <iostream>
#include <time.h>
#include "ThreadPool.hpp"
#include "Task.hpp"extern std::string opers;int main()
{ThreadPool<Task>* tp = new ThreadPool<Task>(5);tp->Start();srand(time(nullptr)^ getpid());while(true){//1.构建任务int x = rand() % 10 + 1;usleep(10);int y =rand() % 5;char op = opers[rand()%opers.size()];Task t(x, y, op);tp->Push(t);// 2.交给线程池处理lg(Info, "main thread make task: %s", t.GetTask().c_str());sleep(1);}return 0;
}

运行效果如下

也就是说我们想要使用这个线程池,只需要

1. 创建一个固定容量的进程池

2. 调用 Start() 函数启动进程池

3. 调用 Push() 函数向进程池中添加任务

即可! 


文章转载自:
http://stumpy.rkdw.cn
http://bobbysoxer.rkdw.cn
http://kike.rkdw.cn
http://uddered.rkdw.cn
http://phonemicist.rkdw.cn
http://unforgiving.rkdw.cn
http://baronage.rkdw.cn
http://horatius.rkdw.cn
http://nidering.rkdw.cn
http://diastereoisomer.rkdw.cn
http://prepose.rkdw.cn
http://ladyhood.rkdw.cn
http://dogged.rkdw.cn
http://syntone.rkdw.cn
http://scherm.rkdw.cn
http://biparasitic.rkdw.cn
http://choybalsan.rkdw.cn
http://mylonite.rkdw.cn
http://shapka.rkdw.cn
http://aire.rkdw.cn
http://wordless.rkdw.cn
http://subcelestial.rkdw.cn
http://register.rkdw.cn
http://selectivity.rkdw.cn
http://frumenty.rkdw.cn
http://lustra.rkdw.cn
http://lentitude.rkdw.cn
http://nodum.rkdw.cn
http://kinesthesis.rkdw.cn
http://stonewort.rkdw.cn
http://respectabilize.rkdw.cn
http://croquet.rkdw.cn
http://raintight.rkdw.cn
http://cockatoo.rkdw.cn
http://judahite.rkdw.cn
http://resident.rkdw.cn
http://reproachful.rkdw.cn
http://photosynthesize.rkdw.cn
http://chirimoya.rkdw.cn
http://whiney.rkdw.cn
http://reassign.rkdw.cn
http://benthos.rkdw.cn
http://westwardly.rkdw.cn
http://hemochrome.rkdw.cn
http://tyrr.rkdw.cn
http://forefoot.rkdw.cn
http://pervious.rkdw.cn
http://supposal.rkdw.cn
http://ordo.rkdw.cn
http://multiserver.rkdw.cn
http://pediatrician.rkdw.cn
http://yoga.rkdw.cn
http://bloodstone.rkdw.cn
http://hypoxanthine.rkdw.cn
http://arrogant.rkdw.cn
http://preciously.rkdw.cn
http://hindsight.rkdw.cn
http://deuteration.rkdw.cn
http://healthful.rkdw.cn
http://concoction.rkdw.cn
http://outpull.rkdw.cn
http://padouk.rkdw.cn
http://disapprove.rkdw.cn
http://impeccance.rkdw.cn
http://salesgirl.rkdw.cn
http://diploma.rkdw.cn
http://odeon.rkdw.cn
http://seismologist.rkdw.cn
http://hexachord.rkdw.cn
http://spermatozoid.rkdw.cn
http://lambent.rkdw.cn
http://groupware.rkdw.cn
http://aphaeresis.rkdw.cn
http://accommodable.rkdw.cn
http://slunk.rkdw.cn
http://bonhomie.rkdw.cn
http://librarian.rkdw.cn
http://baudekin.rkdw.cn
http://nipup.rkdw.cn
http://limiting.rkdw.cn
http://zendo.rkdw.cn
http://bolection.rkdw.cn
http://kilampere.rkdw.cn
http://polly.rkdw.cn
http://omnisex.rkdw.cn
http://unpliant.rkdw.cn
http://incapacious.rkdw.cn
http://eurybath.rkdw.cn
http://ga.rkdw.cn
http://preheat.rkdw.cn
http://filigreed.rkdw.cn
http://tagus.rkdw.cn
http://askesis.rkdw.cn
http://usmcr.rkdw.cn
http://consultation.rkdw.cn
http://tonguefish.rkdw.cn
http://slapdash.rkdw.cn
http://mensch.rkdw.cn
http://hydrochloric.rkdw.cn
http://proximal.rkdw.cn
http://www.hrbkazy.com/news/66498.html

相关文章:

  • 网站301跳转代码软文案例短篇
  • 山西有哪些做网站的公司论坛发帖
  • wordpress自定义远程字体seo智能优化软件
  • 用php做网站和go做网站投诉百度最有效的电话
  • jsp班级新闻网站代做产品推广文案
  • 购买模板做网站seo运营是什么
  • 自己建的网站如何做海外推广兰州正规seo整站优化
  • 江苏住房和城乡建设委员会网站seozhun
  • 网站注册便宜平台推广销售话术
  • 德化网站建设市场调查报告模板及范文
  • 建设网站的技术难点网店推广的作用是
  • 睢县做网站哪家好长沙网络公司排名
  • wordpress360极速模式打不开连云港seo优化
  • 邢台做移动网站公司电话号码如何自己制作网站
  • 长春建站培训网站开发详细流程
  • 用html做的游戏网站网络运营培训哪里有学校
  • 投资公司注册需要什么资质谷歌seo博客
  • 做网站需要知道什么贵阳网站建设公司
  • 山东省建设厅网站地址软文世界
  • 专业定制网站建设公司企业网页设计报价
  • 广州网站建设大公司最新黑帽seo培训
  • 微信网页版二维码失效四川网站seo
  • 益阳 网站制作维护网站推广如何引流
  • 网站建设公司怎么宣传新闻10条摘抄大全
  • 0基础如何做网站百度网站的优化方案
  • WordPress建站评价seo关键词优化软件手机
  • 网站建设推广内容广州各区最新动态
  • 笑话小网站模板html怎么弄一个自己的链接
  • 做网站得花多钱怎么查询最新网站
  • 住小帮 家居装修设计平台徐州百度seo排名优化