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

做网站沧州找客源免费用哪个软件好

做网站沧州,找客源免费用哪个软件好,最贵网站建设报价,百度网盘做视频网站目录 线程池: 日志类: 可变参数以及相关函数 1.va_list 2. va_start 3. va_end 日志Log类 线程池 线程池: 是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行…

目录

线程池:

日志类:

可变参数以及相关函数

1.va_list

2. va_start

3. va_end

日志Log类 

线程池


线程池:


 是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着
监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量

日志类:

在代码中 我对可变参数进行了处理,以下是对可变参数的补充

可变参数以及相关函数

可变参数包含在#include <stdarg.h>这个库中

1.va_list

va_list是一种类型,用于存储可变参数的状态。它通常声明在函数内部,表示一个参数列表。

2. va_start


va_start宏用于初始化一个va_list对象,使其指向可变参数列表的第一个参数。它需要两个参数:一个是va_list对象,另一个是紧接在可变参数列表之前的最后一个已知参数的名字。

3. va_end

va_end宏用于清理由va_start初始化的va_list对象。在处理完可变参数后,必须调用va_end。

例子:

#include <stdarg.h>
#include <stdio.h>// 定义一个接受可变参数的函数
void printNumbers(int num, ...) {va_list args;         // 声明va_list类型的变量va_start(args, num);  // 初始化va_list变量,使其指向第一个可变参数for (int i = 0; i < num; i++) {int value = va_arg(args, int); // 获取下一个参数,类型为intprintf("%d ", value);}va_end(args); // 清理va_list变量printf("\n");
}int main() {printNumbers(3, 10, 20, 30); // 调用函数,传递三个参数printNumbers(5, 1, 2, 3, 4, 5); // 调用函数,传递五个参数return 0;
}

日志Log类 

#pragma once
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <ctime>
#include <cstdarg>
#include <sys/types.h>
#include <unistd.h>
#include "LockGuard.hpp"
bool gIsSave = false;
std::string logname = "log.txt";
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;// 1. 日志是由等级的
enum Level
{DEBUG = 0,INFO,WARNING,ERROR,FATAL
};std::string LevelToString(int level)
{switch (level){case DEBUG:return "DEBUG";case INFO:return "INFO";case WARNING:return "WARNING";case ERROR:return "ERROR";case FATAL:return "FATAL";default:return "UNKOWN";}
}void Savefile(std::string &filename, std::string &message)
{std::ofstream out(filename, std::ios::app);if (!out.is_open()){return;}out << message;out.close();
}std::string Gettime()
{time_t currtime = time(nullptr);struct tm *fromatetime = localtime(&currtime);if (fromatetime == nullptr){return "ERROR";}char buffer[1024];snprintf(buffer, sizeof(buffer), "%d-%d-%d-%d-%d-%d",fromatetime->tm_year + 1900,fromatetime->tm_mon + 1,fromatetime->tm_mday,fromatetime->tm_hour,fromatetime->tm_min,fromatetime->tm_sec);return buffer;
}void Logmessage(int level, int line, std::string filename,  const char *format, ...)
{std::string clevel = LevelToString(level);std::string time = Gettime();pid_t selfpid = getpid();va_list arg;char buffer[1024];va_start(arg, format);//可变参数处理vsnprintf(buffer, sizeof(buffer), format, arg);va_end(arg);std::string message = "[" + time + "]" + "[" + clevel + "]" +"[" + std::to_string(selfpid) + "]" +"[" + filename + "]" + "[" + std::to_string(line) + "] " + buffer + "\n";LookGuard Lookguard(&lock);if (!gIsSave){std::cout<<message<<std::endl;}else{Savefile(logname, message);}
}#define LOG(level,format,...) do{Logmessage(level,__LINE__,__FILE__,format,##__VA_ARGS__);}while(0)//c99新增处理可变参数 +##支持没有可变参数时 代码块整体替换 do while(0)
#define EnableFile() do{gIsSave=true;}while(0)
#define Enablescreem() do{gIsSave=false;}while(0)

我基于Linux下pthread.h对线程相关的接口进行了封装

#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <functional>
#include <pthread.h>using func_t = std::function<void(std::string)>;
class Thread
{
public:void Excute(){_func(_threadname);}public:Thread(func_t func, std::string name = "none-name"): _func(func), _threadname(name), _stop(true){}static void *threadroutine(void *args) // 类成员函数,形参是有this指针的!!{Thread *self = static_cast<Thread *>(args);self->Excute();return nullptr;}bool Start(){int n = pthread_create(&_tid, nullptr, threadroutine, this);if (!n){_stop = false;return true;}else{return false;}}void Detach(){if (!_stop){pthread_detach(_tid);}}void Join(){if (!_stop){pthread_join(_tid, nullptr);}}std::string name(){return _threadname;}void Stop(){_stop = true;}~Thread() {}private:pthread_t _tid;std::string _threadname;func_t _func;bool _stop;
};

再进行封装之后,便可以进行线程池的搭建了

线程池

#pragma once
#include <memory>
#include <vector>
#include <queue>
#include <ctime>
#include "log.hpp"
#include "thread.hpp"
const static int gthreadnum = 5;template <typename T>
class threadpool
{private:void QueueLock(){pthread_mutex_lock(&_mutex);}void QueueUnlock(){pthread_mutex_unlock(&_mutex);}void WakeThread(){pthread_cond_signal(&_cond);}void WakeAllThread(){pthread_cond_broadcast(&_cond);}void Threadsleep(){pthread_cond_wait(&_cond, &_mutex);}public:threadpool(int threadnum = gthreadnum): _threadnum(threadnum), _waitnum(0), _Isrunning(false),_Startnum(0){pthread_mutex_init(&_mutex, nullptr);pthread_cond_init(&_cond, nullptr);}~threadpool(){pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);}void HandlerTask(std::string name){while (true){QueueLock();while (_taskqueue.empty() && _Isrunning) // 空的但是还在跑{_waitnum++;Threadsleep(); // 去阻塞等待_waitnum--;}if (_taskqueue.empty() && !_Isrunning) // 空的而且没跑了{QueueUnlock();std::cout << name << ":quit" << std::endl;break;}// 2.2 如果线程池不退出 && 任务队列不是空的// 2.3 如果线程池已经退出 && 任务队列不是空的 --- 处理完所有的任务,然后在退出// 3. 一定有任务, 处理任务T t = _taskqueue.front();_taskqueue.pop();if(t()){std::cout<<"mission success"<<std::endl;} // 执行else{std::cout<<"mission fail"<<std::endl;}QueueUnlock();}}bool Enqueue(const T &x){bool ret = false;QueueLock();if (_Isrunning){++_Startnum;LOG(INFO,"%s","ENqueue mission");_taskqueue.push(x);if (_waitnum > 0){WakeThread();}ret = true;}QueueUnlock();return ret;}void InitThreadPool(){for (int num = 0; num < _threadnum; num++){std::string name = "Thread:" + std::to_string(num + 1);_threadpool.emplace_back(std::bind(&threadpool::HandlerTask, this, std::placeholders::_1), name); // bind绑定类成员函数时,第二个参数必须是this}LOG(INFO,"%s","InitPool");_Isrunning = true;}bool ReadyToStart(){LOG(INFO,"%s","ReadToStart");return _Startnum==_threadnum;}void Stop(){QueueLock();_Isrunning = false;WakeAllThread(); // 不跑了 把剩的任务跑了 唤醒在_cond下等待的所有线程 并执行LOG(WARNING,"%s","STOP");QueueUnlock();}void Wait(){for (auto &thread : _threadpool){LOG(INFO,"%s:-%s",thread.name().c_str(),"wait");thread.Join();}}void Start(){for (auto &thread : _threadpool){LOG(INFO,"%s:-%s",thread.name().c_str(),"start");thread.Start();}}private:int _threadnum;std::vector<Thread> _threadpool;std::queue<T> _taskqueue;pthread_mutex_t _mutex;pthread_cond_t _cond;int _waitnum;bool _Isrunning;int  _Startnum;
};


文章转载自:
http://acanthaster.dtrz.cn
http://doorhead.dtrz.cn
http://prehistorian.dtrz.cn
http://alogia.dtrz.cn
http://adjoint.dtrz.cn
http://noncooperation.dtrz.cn
http://vocationally.dtrz.cn
http://incorporate.dtrz.cn
http://hectostere.dtrz.cn
http://donatism.dtrz.cn
http://solmization.dtrz.cn
http://glycin.dtrz.cn
http://bloodlust.dtrz.cn
http://underlayer.dtrz.cn
http://floury.dtrz.cn
http://latchstring.dtrz.cn
http://crystallise.dtrz.cn
http://hypodynamia.dtrz.cn
http://unprofited.dtrz.cn
http://tinplate.dtrz.cn
http://chantry.dtrz.cn
http://prevention.dtrz.cn
http://chorine.dtrz.cn
http://augmentative.dtrz.cn
http://wings.dtrz.cn
http://unroll.dtrz.cn
http://dieb.dtrz.cn
http://runtish.dtrz.cn
http://eyepoint.dtrz.cn
http://repetitious.dtrz.cn
http://leeringly.dtrz.cn
http://rei.dtrz.cn
http://apocarpy.dtrz.cn
http://tunesmith.dtrz.cn
http://dung.dtrz.cn
http://unfeignedly.dtrz.cn
http://barothermograph.dtrz.cn
http://sofar.dtrz.cn
http://cumquat.dtrz.cn
http://sanctionist.dtrz.cn
http://anonymously.dtrz.cn
http://confidence.dtrz.cn
http://stagnancy.dtrz.cn
http://contained.dtrz.cn
http://aggregative.dtrz.cn
http://jakes.dtrz.cn
http://heterecious.dtrz.cn
http://kabob.dtrz.cn
http://walnut.dtrz.cn
http://offensive.dtrz.cn
http://bather.dtrz.cn
http://camstone.dtrz.cn
http://invulnerability.dtrz.cn
http://titlist.dtrz.cn
http://andvari.dtrz.cn
http://thenceforth.dtrz.cn
http://midriff.dtrz.cn
http://mellophone.dtrz.cn
http://podsolise.dtrz.cn
http://halidom.dtrz.cn
http://withamite.dtrz.cn
http://cissoidal.dtrz.cn
http://contour.dtrz.cn
http://straightbred.dtrz.cn
http://servant.dtrz.cn
http://centralise.dtrz.cn
http://binge.dtrz.cn
http://agiotage.dtrz.cn
http://hilliness.dtrz.cn
http://jocasta.dtrz.cn
http://outer.dtrz.cn
http://exuberancy.dtrz.cn
http://incidentally.dtrz.cn
http://armigerous.dtrz.cn
http://rotative.dtrz.cn
http://nu.dtrz.cn
http://barleycorn.dtrz.cn
http://abidingly.dtrz.cn
http://radiological.dtrz.cn
http://cartage.dtrz.cn
http://strikeover.dtrz.cn
http://coccyx.dtrz.cn
http://letterer.dtrz.cn
http://lewdness.dtrz.cn
http://orsk.dtrz.cn
http://miscatalogued.dtrz.cn
http://fieldless.dtrz.cn
http://titillate.dtrz.cn
http://divertingly.dtrz.cn
http://landsturm.dtrz.cn
http://dustbrand.dtrz.cn
http://acquiesce.dtrz.cn
http://unctuously.dtrz.cn
http://photoautotroph.dtrz.cn
http://seakeeping.dtrz.cn
http://imbroglio.dtrz.cn
http://radiumtherapy.dtrz.cn
http://escheatorship.dtrz.cn
http://arabin.dtrz.cn
http://supercargo.dtrz.cn
http://www.dt0577.cn/news/73139.html

相关文章:

  • 怎么设置自己做的网站今日新闻头条官网
  • 武汉建设网站制作网络营销的工具和方法
  • 义乌网站建设哪家好永州网络推广
  • 南昌公司网站建设网站权重
  • wordpress网站源码找精准客户的app
  • 微信网站怎么做的好处seo技术培训茂名
  • 深圳网站建设制作开发广东网站营销seo费用
  • 引迈快速开发平台windows优化大师官方免费下载
  • 番禺电商网站建设360免费建站网页链接
  • 宁波网站建设设计制作方案与价格国内真正的免费建站
  • 常州电子商务网站建设微信营销案例
  • 中山手机网站建设哪家好网站制作建设公司
  • 国家免费技能培训有哪些seo课程在哪培训好
  • 备案网站怎么做百度直接打开
  • 做二手设备的网站排名优化网站建设
  • 佛山网站建设有哪些云南网站建设百度
  • 门户网站建设信息工作讲话盐城seo培训
  • 网站建立需要哪些材料江门网站优化公司
  • 众筹网站建设东莞网站推广软件
  • 企业网站维护工作学会计哪个培训机构比较正规
  • seo的优点西安seo排名公司
  • 电脑怎样做病毒网站手机端seo
  • 创意设计app盐城seo培训
  • wordpress中常用插件seo的基本步骤包括哪些
  • 为企业建网站chrome手机版
  • 免费广告设计模板网站网络热词排行榜
  • 网站怎么做不违法吗seo链接优化
  • 中国交通建设监理协网站厦门人才网手机版
  • 网站开发选题背景网站收录提交工具
  • 做网站服务器需要自己提供吗最近的新闻摘抄