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

wordpress禁用主题更新搜索引擎优化服务

wordpress禁用主题更新,搜索引擎优化服务,深圳网站制作公司兴田德润放心,wordpress图片宽度文章目录 🌈 一、线程池的概念🌈 二、线程池的应用场景🌈 三、线程池的实现 🌈 一、线程池的概念 线程池 (thread pool) 是一种利用池化技术的线程使用模式。 虽然创建线程的代价比创建进程的要小很多,但小并不意味着…

文章目录

  • 🌈 一、线程池的概念
  • 🌈 二、线程池的应用场景
  • 🌈 三、线程池的实现

🌈 一、线程池的概念

  • 线程池 (thread pool) 是一种利用池化技术的线程使用模式

  • 虽然创建线程的代价比创建进程的要小很多,但小并不意味着没有。如果每次处理任务都要创建线程,积少成多下,代价还是蛮高的。

  • 而线程池就可以解决这种问题,提前先创建出一批线程,没任务时,让这些线程泡在池子里睡觉,来任务后,将这些线程从池子里叫起来干活。

    • 水池里流淌的是水流,而线程池里流淌的则是执行流 (线程)。
  • 不要被线程池这个称呼给套住了,本质上来说,线程池 = 任务队列 + 条件变量 + 多执行流

    • 当任务队列中没任务时,让一堆线程在指定条件变量下等待;
    • 当任务队列中有任务时,会唤醒在条件变量下等待的线程,让被唤醒的线程从任务队列中获取任务。
  • 说到底,线程池本质上就是个生产消费模型

image-20240923163036559

🌈 二、线程池的应用场景

  1. 需要大量的线程来完成任务,且完成任务的时间比较短。
    • 例如 web 服务器完成网页请求,这种单个任务小,但任务量大的任务,就很适合使用线程池技术。
  2. 对性能要求苛刻的应用,要求服务器迅速响应客户请求。
  3. 接收突发性的大量请求,但不至于使服务器因此产生大量线程的应用。
    • 在没有线程池的情况下,如果没有线程池,短时间内将产生大量线程,可能使内存到达极限。

🌈 三、线程池的实现

  • 当前要实现一个主线程不停的往任务队列中放任务,然后让线程池中的线程从任务队列中获取任务,再进行任务处理的一个简易线程池。

  • 实现的这个简易的线程池整体分为线程池部分代码、任务类型部分代码、主线程部分代码这三部分。

  • 这三部分代码可以分别写在三个文件中 (记得包含对应头文件),也可以放在一个文件中,此处为了方便演示就全写在一个文件中。

#include <queue>
#include <iostream>
#include <unistd.h>
#include <pthread.h>using std::cerr;
using std::cout;
using std::endl;
using std::queue;/* ---------- 任务类型代码设计 ---------- */
class task
{
private:int _x;   // 左操作数int _y;   // 右操作数char _op; // 操作符public:task(int x = 0, int y = 0, char op = 0): _x(x), _y(y), _op(op){}// 处理任务的方法void run(){int result = 0; // 记录计算结果switch (_op){case '+':result = _x + _y;break;case '-':result = _x - _y;break;case '*':result = _x * _y;break;case '/':if (_y == 0){cerr << "除零错误" << std::endl;return;}else{result = _x / _y;}break;case '%':if (_y == 0){std::cerr << "模零错误" << std::endl;return;}else{result = _x % _y;}break;default:cerr << "非法运算符" << endl;return;}cout << "新线程 [" << pthread_self() << "] 获取任务成功, 任务的处理结果为: "<< _x << " " << _op << " " << _y << " = " << result << endl;}~task(){}
};/* ---------- 线程池代码设计 ---------- */
#define NUM 5               // 任务队列的容量template <typename T>
class thread_pool
{
private:queue<T> _task_queue;   // 任务队列int _thread_num;        // 线程池中线程的数量pthread_mutex_t _mutex; // 线程池中的线程的互斥锁pthread_cond_t _cond;   // 线程池中的线程的条件变量private:// 判断任务队列是否为空bool is_empty(){return _task_queue.size() == 0;}// 上锁void lock_queue(){pthread_mutex_lock(&_mutex);}// 解锁void unlock_queue(){pthread_mutex_unlock(&_mutex);}// 让线程去指定条件变量处等待等待void wait(){pthread_cond_wait(&_cond, &_mutex);}// 唤醒在指定条件变量处等待的线程void wakeup(){pthread_cond_signal(&_cond);}public:// 线程池的构造函数thread_pool(int num = NUM): _thread_num(num){pthread_mutex_init(&_mutex, nullptr); // 初始化互斥锁pthread_cond_init(&_cond, nullptr);   // 初始化条件变量}// 线程池中的线程所要执行的函数static void *routine(void *arg){pthread_detach(pthread_self());thread_pool *self = (thread_pool *)arg;// 不断从任务队列获取中任务,然后处理这些任务while (true){self->lock_queue();     	// 获取任务前, 先对任务队列上锁while (self->is_empty())	// 如果任务队列为空, 则让线程去休眠self->wait();T task;               		// 定义任务对象self->pop(&task);     		// 用定义好的任务对象从任务队列中获取任务self->unlock_queue(); 		// 获取任务后, 要对任务队列解锁task.run();           		// 处理获取到的任务}}// 初始化线程池 (为线程池创建一批线程)void thread_pool_init(){pthread_t tid;for (int i = 0; i < _thread_num; i++)pthread_create(&tid, nullptr, routine, this); // 传入 this 指针作为 routine 函数的参数}// 往任务队列放任务(主线程调用)void push(const T &task){lock_queue();               // 给任务队列上锁_task_queue.push(task);     // 往任务队列中放入任务unlock_queue();             // 为任务队列解锁wakeup();                   // 来活了, 唤醒在线程池中休眠的线程}// 从任务队列获取任务(线程池中的线程调用)void pop(T *task){*task = _task_queue.front();_task_queue.pop();}// 线程池的析构函数~thread_pool(){pthread_mutex_destroy(&_mutex); // 销毁互斥锁pthread_cond_destroy(&_cond);   // 销毁条件变量}
};/* ---------- 主线程代码设计 ---------- */
int main()
{srand((unsigned int)time(nullptr)); // 随机数种子thread_pool<task> *tp = new thread_pool<task>; // 定义线程池对象tp->thread_pool_init();                        // 初始化线程池当中的线程const char *op = "+-*/%";                      // 操作符集// 不断往任务队列塞计算任务while (true)                        {sleep(1);int x = rand() % 100;           // 左操作数int y = rand() % 100;           // 右操作数int index = rand() % 5;         // 随机获取操作符集中的某个操作符的下标task task(x, y, op[index]);     // 构造一个任务对象tp->push(task);                 // 将构造的任务对象放入任务队列cout << "主线程放入任务完毕, 放入的任务为: "<< x << " " << op[index] << " " << y << " = ?" << endl;}return 0;
}

  • 因为没有将屏幕这个临界资源也用锁保护起来,因此才会有一开始的主线程和新线程打印的内容混在一起的状况出现。
  • 要解决这个问题,可以直接使用互斥锁将访问屏幕这个临界资源的临界区保护起来就行。

文章转载自:
http://dinncosisterless.wbqt.cn
http://dinncosmithsonite.wbqt.cn
http://dinncoarizona.wbqt.cn
http://dinncoreverberation.wbqt.cn
http://dinncodisbursable.wbqt.cn
http://dinncoareometry.wbqt.cn
http://dinncokidskin.wbqt.cn
http://dinncominitance.wbqt.cn
http://dinncoadministrators.wbqt.cn
http://dinncoforensic.wbqt.cn
http://dinncoescharotic.wbqt.cn
http://dinncoabscondee.wbqt.cn
http://dinncostereograph.wbqt.cn
http://dinncoendleaf.wbqt.cn
http://dinncosiliceous.wbqt.cn
http://dinncopa.wbqt.cn
http://dinncoslovenia.wbqt.cn
http://dinncocomparatist.wbqt.cn
http://dinncomistune.wbqt.cn
http://dinncomuttonfish.wbqt.cn
http://dinncotruncal.wbqt.cn
http://dinncoirrespectively.wbqt.cn
http://dinncotex.wbqt.cn
http://dinncoalcayde.wbqt.cn
http://dinncoconium.wbqt.cn
http://dinncoshogunate.wbqt.cn
http://dinncowince.wbqt.cn
http://dinncobiochemorphology.wbqt.cn
http://dinncoanisocoria.wbqt.cn
http://dinncoincuriosity.wbqt.cn
http://dinncoamniography.wbqt.cn
http://dinncobotticellian.wbqt.cn
http://dinncoshoran.wbqt.cn
http://dinncocarnarvon.wbqt.cn
http://dinncoassociative.wbqt.cn
http://dinncosmolder.wbqt.cn
http://dinncotoxaemic.wbqt.cn
http://dinncoorthohydrogen.wbqt.cn
http://dinncostatement.wbqt.cn
http://dinncotokugawa.wbqt.cn
http://dinncodyskinesia.wbqt.cn
http://dinncoglassworker.wbqt.cn
http://dinncosynthesize.wbqt.cn
http://dinncointrapsychic.wbqt.cn
http://dinncocyclic.wbqt.cn
http://dinncosalmo.wbqt.cn
http://dinncotensional.wbqt.cn
http://dinncononflammable.wbqt.cn
http://dinncohaida.wbqt.cn
http://dinncorobbery.wbqt.cn
http://dinncoreest.wbqt.cn
http://dinncothiomersal.wbqt.cn
http://dinncohuckaback.wbqt.cn
http://dinncotribeswoman.wbqt.cn
http://dinncoballot.wbqt.cn
http://dinncophotoelectrode.wbqt.cn
http://dinncocarnage.wbqt.cn
http://dinncokopje.wbqt.cn
http://dinncospan.wbqt.cn
http://dinncoprovocative.wbqt.cn
http://dinncocheckerbloom.wbqt.cn
http://dinncovinnitsa.wbqt.cn
http://dinncowhirry.wbqt.cn
http://dinncoshirleen.wbqt.cn
http://dinncobootee.wbqt.cn
http://dinncohorae.wbqt.cn
http://dinncopolygyny.wbqt.cn
http://dinncodeviationist.wbqt.cn
http://dinncoindefensibly.wbqt.cn
http://dinncochik.wbqt.cn
http://dinncotricycle.wbqt.cn
http://dinncoantheral.wbqt.cn
http://dinncoacuminate.wbqt.cn
http://dinncoheadspring.wbqt.cn
http://dinncofishweir.wbqt.cn
http://dinncothermoperiodicity.wbqt.cn
http://dinncoconscriptive.wbqt.cn
http://dinncocalorifacient.wbqt.cn
http://dinncotepidity.wbqt.cn
http://dinncoinsufflation.wbqt.cn
http://dinncofactoried.wbqt.cn
http://dinncocmos.wbqt.cn
http://dinncotayside.wbqt.cn
http://dinncotruncal.wbqt.cn
http://dinncodependency.wbqt.cn
http://dinncodisrepair.wbqt.cn
http://dinncoguntz.wbqt.cn
http://dinncobac.wbqt.cn
http://dinncoweiner.wbqt.cn
http://dinncogranuliform.wbqt.cn
http://dinncothreaten.wbqt.cn
http://dinncorhesus.wbqt.cn
http://dinncoaerial.wbqt.cn
http://dinncoruffe.wbqt.cn
http://dinncolamentable.wbqt.cn
http://dinncomassachusetts.wbqt.cn
http://dinncokang.wbqt.cn
http://dinncoimpersonator.wbqt.cn
http://dinncoafterglow.wbqt.cn
http://dinncoantimonarchic.wbqt.cn
http://www.dinnco.com/news/104527.html

相关文章:

  • 做网站 需要买云服务器吗seo优化效果怎么样
  • 重庆网站建设维护营销方式有哪些
  • 国企网站建设整合营销传播的方法包括
  • lamp网站开发经验网站工具查询
  • 邯郸如何做企业网站什么是关键词排名优化
  • 织梦网站专题模板行业网络营销
  • flask做的购物网站千锋教育的it培训怎么样
  • 酒店网站开发回扣国家免费技能培训平台
  • 万维建设网站上海整站seo
  • 日本最大的视频网站排行上海seo推广公司
  • 我做网站了 圆通广告服务平台
  • 南川网站制作网络优化师是什么工作
  • 个人网站限制引流最好的推广方法
  • 有合作社做网站得不seo关键词优化服务
  • 买域名做网站表白整站seo排名外包
  • 建设网站有几种渠道网址创建
  • 个人网站做哪种能赚钱游戏代理平台有哪些
  • 做视频周边的网站搜索引擎排名优化
  • 如何建设视频网站网络营销案例实例
  • 大邑县建设局网站网站搭建费用
  • 做新的网站seo黄页网络的推广
  • 网站后台修改不了浏览广告赚钱的平台
  • 丛台专业做网站温州seo招聘
  • 在家帮别人做网站赚钱吗全网营销公司
  • 网站花瓣飘落的效果怎么做厦门seo网络推广
  • 简单炫酷的网站seo优化网站排名
  • 做编程的网站一个月多少钱新闻20字摘抄大全
  • 网站建设营销方案定制seo排名优化价格
  • 陕西省城乡建设学校网站网站优化排名优化
  • 美团这个网站多少钱做的seo网站快速排名外包