建筑招聘网站有哪些电子商务网站建设与管理感想和收获

张小明 2026/1/9 21:28:02
建筑招聘网站有哪些,电子商务网站建设与管理感想和收获,360免费建站怎么样,中原区快速建站公司电话1.概念 基本概念 线程池是一种多线程处理形式#xff0c;它预先创建一组线程并管理它们#xff0c;避免频繁创建和销毁线程带来的性能开销。 在 Linux 环境下#xff0c;线程池#xff08;Thread Pool#xff09;是一种常用的并发编程模型#xff0c;用于复用线程资源它预先创建一组线程并管理它们避免频繁创建和销毁线程带来的性能开销。在 Linux 环境下线程池Thread Pool是一种常用的并发编程模型用于复用线程资源避免频繁创建和销毁线程带来的性能开销。它特别适用于高并发、短任务的场景比如 Web 服务器、数据库连接池、异步任务处理等为什么需要线程池降低资源消耗重复利用已创建的线程提高响应速度任务到达时可直接执行无需等待线程创建提高线程可管理性统一分配、调优和监控防止资源耗尽避免无限制创建线程导致系统崩溃✅ 线程池的核心组件组件作用说明任务队列存放待执行的任务函数指针、lambda、function 等工作线程从任务队列中取出任务并执行同步机制使用互斥锁和条件变量实现线程间通信线程复用线程执行完任务后不退出而是继续等待下一个任务✅ 线程池的优势优势说明性能提升避免频繁创建/销毁线程资源控制限制最大并发线程数防止系统过载任务调度可配合优先级队列、延迟任务等机制✅ 线程池的注意事项问题解决方案任务阻塞避免在线程池中执行阻塞 IO必要时使用异步 IO异常处理任务中抛出的异常不会自动传播需手动捕获线程池作用线程池是一种线程使用模式。线程过多会带来调度开销进而影响缓存局部性和整体性能。而线程池维护着多个线程等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程池的应用场景• 需要大量的线程来完成任务且完成任务的时间比较短。 比如WEB服务器完成网页请求这样的任务使用线程池技术是非常合适的。因为单个任务小而任务数量巨大你可以想象一个热门网站的点击次数。 但对于长时间的任务比如一个Telnet连接请求线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。• 对性能要求苛刻的应用比如要求服务器迅速响应客户请求。• 接受突发性的大量请求但不至于使服务器因此产生大量线程的应用。突发性大量客户请求在没有线程池情况下将产生大量线程虽然理论上大部分操作系统线程数目最大值不是问题短时间内产生大量线程可能使内存到达极限出现错误.线程池的种类a. 创建固定数量线程池循环从任务队列中获取任务对象获取到任务对象后执行任务对象中的任务接口b. 浮动线程池其他同上此处我们选择固定线程个数的线程池。2.实现前置头文件thread_pool_test:thread_pool_test.pp g-o $ $^-stdc17-lpthread.PHONY:clean clean:rm-f thread_pool_test#pragmaonce#includeiostream#includepthread.h#includeMutex.hppclassCond{public:Cond(){pthread_cond_init(_cond,nullptr);}voidWait(Mutexlock){intnpthread_cond_wait(_cond,lock.Get());}voidNotifyOne(){intnpthread_cond_signal(_cond);(void)n;}voidNotifyAll(){intnpthread_cond_broadcast(_cond);(void)n;}~Cond(){pthread_cond_destroy(_cond);}private:pthread_cond_t _cond;};#pragmaonce#includeiostream#includemutex#includepthread.hclassMutex{public:Mutex(){pthread_mutex_init(_lock,nullptr);}voidLock(){pthread_mutex_lock(_lock);}voidUnlock(){pthread_mutex_unlock(_lock);}pthread_mutex_t*Get(){return_lock;}~Mutex(){pthread_mutex_destroy(_lock);}private:pthread_mutex_t _lock;};classLockGuard{public:LockGuard(Mutex*_mutex):_mutexp(_mutex){_mutexp-Lock();}~LockGuard(){_mutexp-Unlock();}private:Mutex*_mutexp;};#pragmaonce#includeiostream#includestring#includefilesystem// C17 文件操作#includefstream#includectime#includeunistd.h#includememory#includesstream#includeMutex.hpp// 规定出场景的日志等级enumclassLogLevel{DEBUG,INFO,WARNING,ERROR,FATAL};// 日志转换成为字符串std::stringLevel2String(LogLevel level){switch(level){caseLogLevel::DEBUG:returnDebug;caseLogLevel::INFO:returnInfo;caseLogLevel::WARNING:returnWarning;caseLogLevel::ERROR:returnError;caseLogLevel::FATAL:returnFatal;default:returnUnknown;}}// 根据时间戳获取可读性较强的时间信息// 20XX-08-04 12:27:03std::stringGetCurrentTime(){// 1. 获取时间戳time_t currtimetime(nullptr);// 2. 如何把时间戳转换成为20XX-08-04 12:27:03structtmcurrtm;localtime_r(currtime,currtm);// 3. 转换成为字符串chartimebuffer[64];snprintf(timebuffer,sizeof(timebuffer),%4d-%02d-%02d %02d:%02d:%02d,currtm.tm_year1900,currtm.tm_mon1,currtm.tm_mday,currtm.tm_hour,currtm.tm_min,currtm.tm_sec);returntimebuffer;}// 策略模式策略接口// 1. 刷新的问题 -- 假设我们已经有了一条完整的日志string-设备(显示器文件)// 基类方法classLogStrategy{public:// 不同模式核心是刷新方式的不同virtual~LogStrategy()default;virtualvoidSyncLog(conststd::stringlogmessage)0;};// 控制台日志策略,就是日志只向显示器打印方便我们debug// 显示器刷新classConsoleLogStrategy:publicLogStrategy{public:~ConsoleLogStrategy(){}voidSyncLog(conststd::stringlogmessage)override{{LockGuardlockguard(_lock);std::coutlogmessagestd::endl;}}private:// 显示器也是临界资源保证输出线程安全Mutex _lock;};// 默认路径和日志名称conststd::string logdefaultdirlog;conststaticstd::string logfilenametest.log;// 文件日志策略// 文件刷新classFileLogStrategy:publicLogStrategy{public:// 构造函数建立出来指定的目录结构和文件结构FileLogStrategy(conststd::stringdirlogdefaultdir,conststd::string filenamelogfilename):_dir_path_name(dir),_filename(filename){LockGuardlockguard(_lock);if(std::filesystem::exists(_dir_path_name)){return;}try{std::filesystem::create_directories(_dir_path_name);}catch(conststd::filesystem::filesystem_errore){std::cerre.what()\r\n;}}// 将一条日志信息写入到文件中voidSyncLog(conststd::stringlogmessage)override{{LockGuardlockguard(_lock);std::string target_dir_path_name;target/;target_filename;// 追加方式std::ofstreamout(target.c_str(),std::ios::app);// appendif(!out.is_open()){return;}outlogmessage\n;// out.writeout.close();}}~FileLogStrategy(){}private:std::string _dir_path_name;// logstd::string _filename;// hello.log log/hello.logMutex _lock;};// 具体的日志类// 1. 定制刷新策略// 2. 构建完整的日志classLogger{public:Logger(){}voidEnableConsoleLogStrategy(){_strategystd::make_uniqueConsoleLogStrategy();}voidEnableFileLogStrategy(){_strategystd::make_uniqueFileLogStrategy();}// 内部类实现RAII风格的日志格式化和刷新// 这个LogMessage表示一条完整的日志对象classLogMessage{public:// RAII风格构造的时候构建好日志头部信息LogMessage(LogLevel level,std::stringfilename,intline,Loggerlogger):_curr_time(GetCurrentTime()),_level(level),_pid(getpid()),_filename(filename),_line(line),_logger(logger){// stringstream不允许拷贝,所以这里就当做格式化功能使用std::stringstream ss;ss[_curr_time] [Level2String(_level)] [_pid] [_filename] [_line] - ;_loginfoss.str();}// 重载 支持C风格的日志输入使用模版表示支持任意类型templatetypenameTLogMessageoperator(constTinfo){std::stringstream ss;ssinfo;_loginfoss.str();return*this;}// RAII风格析构的时候进行日志持久化采用指定的策略~LogMessage(){if(_logger._strategy){_logger._strategy-SyncLog(_loginfo);}}private:std::string _curr_time;// 日志时间LogLevel _level;// 日志等级pid_t _pid;// 进程pidstd::string _filename;int_line;std::string _loginfo;// 一条合并完成的完整的日志信息Logger_logger;// 引用外部logger类, 方便使用策略进行刷新};// 故意拷贝形成LogMessage临时对象后续在被时会被持续引用// 直到完成输入才会自动析构临时LogMessage至此也完成了日志的显示或者刷新// 同时形成的临时对象内包含独立日志数据// 未来采用宏替换进行文件名和代码行数的获取LogMessageoperator()(LogLevel level,std::string filename,intline){returnLogMessage(level,filename,line,*this);}~Logger(){}private:// 写入日志的策略std::unique_ptrLogStrategy_strategy;};// 定义全局的logger对象Logger logger;// 使用宏可以进行代码插入方便随时获取文件名和行号#defineLOG(level)logger(level,__FILE__,__LINE__)// 提供选择使用何种日志策略的方法#defineEnableConsoleLogStrategy()logger.EnableConsoleLogStrategy()#defineEnableFileLogStrategy()logger.EnableFileLogStrategy()#pragmaonce#includeiostream#includefunctional#includeunistd.h#includesstreamclassTask{public:Task(){}Task(intx,inty):a(x),b(y){}voidExecute(){resultab;}voidoperator()(){// sleep(1);Execute();}voidPrint(){std::couta b resultstd::endl;}std::stringResult2String(){std::stringstream ss;ssa b result;returnss.str();}private:inta;intb;intresult;};#pragmaonce#includeiostream#includestring#includepthread.h#includeunistd.h#includefunctional#includesys/syscall.h/* For SYS_xxx definitions */#includeLogger.hpp#defineget_lwp_id()syscall(SYS_gettid)usingfunc_tstd::functionvoid(conststd::stringname);conststd::string threadnamedefaultNone-Name;classThread{public:Thread(func_t func,conststd::stringnamethreadnamedefault):_name(name),_func(func),_isrunning(false){LOG(LogLevel::INFO)_name create thread obj success;}staticvoid*start_routine(void*args){Thread*selfstatic_castThread*(args);self-_isrunningtrue;self-_lwpidget_lwp_id();self-_func(self-_name);pthread_exit((void*)0);}voidStart(){intnpthread_create(_tid,nullptr,start_routine,this);if(n0){LOG(LogLevel::INFO)_name running success;}}voidStop(){intnpthread_cancel(_tid);// 太简单粗暴了(void)n;}// void Die()// {// pthread_cancel(_tid);// }// 检测线程结束并且回收的功能voidJoin(){if(!_isrunning)return;intnpthread_join(_tid,nullptr);if(n0){LOG(LogLevel::INFO)_name pthread_join success;}}~Thread(){// LOG(LogLevel::INFO) _name destory thread obj success;}private:bool_isrunning;pthread_t _tid;pid_t _lwpid;std::string _name;func_t _func;};thread_pool#pragmaonce#includequeue#includevector#includeThread.hpp#includeCond.hpp#includeLogger.hppusingnamespacestd;conststaticintdefault_thread_num5;templatetypenameTclassThreadPool{voidRoutine(string name){while(true){T t;{LockGuardlock(_mutex);// 如果线程池正在运行且任务队列为空// 注意一定要使用while,防止出错while(_is_runningQueueIsEmpty()){_wait_thread_num;_cond.Wait(_mutex);// 线程唤醒后执行的是这里的逻辑 如果队列为空了 就要离开循环了_wait_thread_num--;}// 如果线程池要退出且任务队列为空if(!_is_runningQueueIsEmpty()){LOG(LogLevel::INFO)线程池准备退出任务队列为空 name.c_str()退出;break;}// 此时任务队列一定不为空存在两种情况// 1. 线程池准备退出 -- 消耗历史任务// 2. 线程池没有准备退出 -- 正常工作t_task_queue.front();_task_queue.pop();// LOG(LogLevel::DEBUG) name :::: _task_queue.size();// if (!QueueIsEmpty())// {// t _task_queue.front();// //Linux上面实现的stl库队列为空的时候(size0)还可以去数据导致(size--)// //拿到了一个00 0的任务// //然后size(size_t类型的数据没有负数)就变成了一个非常大的正数队列就不为空了// //这里段错误和数组的越界访问类似 然后一直拿去数据 触发了段错误// _task_queue.pop();// }}// 此时线程已经把任务从临界资源获取到线程私有临界区 - 线程私有的栈// 处理任务时不需要再临界区内部进行并发进行效率更高t();// 规定未来的任务必须这样处理operate()重载LOG(LogLevel::DEBUG)name handler task: t.Result2String();}}public:ThreadPool(intthreadnumdefault_thread_num):_thread_num(threadnum),_wait_thread_num(0),_is_running(false){for(inti1;i_thread_num;i){// 方法1:// auto f std::bind(hello, this);// 方法2string namethread-to_string(i);// emplace_back()是STL容器如vector、deque、list的成员函数// 用于在容器尾部直接构造元素避免不必要的拷贝或移动。_threads.emplace_back([this](conststringname){this-Routine(name);},name);}LOG(LogLevel::INFO)thread pool obj create success;}voidStart(){if(_is_running)return;_is_runningtrue;for(autot:_threads)t.Start();}voidStop(){// 线程池要退出不是立刻就能退出的它要把任务队列中的任务处理完后才能退出if(!_is_running)return;_is_runningfalse;// 线程池都要退出了那些休眠的线程还休眠什么赶紧把他们全部唤醒// 处理完任务后线程池好退出if(_wait_thread_num)_cond.NotifyAll();}voidEnqueue(constTtask){// 如果线程池准备退出任务就不要入队列了if(!_is_running)return;{LockGuardlock(_mutex);_task_queue.push(task);// LOG(LogLevel::DEBUG) 一个任务入队列了;if(_wait_thread_num)_cond.NotifyOne();}}voidWait(){for(autot:_threads){t.Join();}LOG(LogLevel::INFO)thread pool wait success;}boolQueueIsEmpty(){return_task_queue.empty();}~ThreadPool(){}private:// 任务队列queueT_task_queue;// 整体使用的临界资源vectorThread_threads;int_thread_num;// 线程池中线程个数int_wait_thread_num;// 线程池正在等待的线程个数// 保护线程池安全Mutex _mutex;Cond _cond;// 检测线程池是否在运行bool_is_running;};#includeThreadPool.hpp#includeTask.hpp#includetime.h#includememoryintmain(){srand(time(nullptr));//使用控制台策略向显示器输出日志EnableConsoleLogStrategy();unique_ptrThreadPoolTasktpmake_uniqueThreadPoolTask();tp-Start();intcnt10;while(cnt--){intxrand()%91;intyrand()%91;Tasktask(x,y);tp-Enqueue(task);sleep(1);}tp-Stop();tp-Wait();return0;}注意若是if{…}在while{…}前面就会出错如下3 线程池单例模式3.1 概念单例模式确保一个类只有一个实例并提供一个全局访问点。线程池使用单例模式的理由系统中通常只需要一个全局的线程池避免资源浪费多个线程池竞争系统资源便于统一管理和监控3.2 饿汉实现方式和懒汉实现方式[洗碗的例子]吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是懒汉方式.懒汉方式最核心的思想是 “延时加载”. 从而能够优化服务器的启动速度核心区别特性饿汉式 (Eager)懒汉式 (Lazy)初始化时机程序启动时/类加载时第一次使用时线程安全天然线程安全需要额外同步机制资源占用启动时即占用资源使用时才占用资源性能启动慢运行时快启动快第一次使用稍慢实现复杂度简单较复杂3.2.1 饿汉实现方式核心思想“提前准备立即加载”- 在程序启动或类加载时就创建实例。templatetypenameTclassSingleton{staticT data;//静态全局变量定义在全局数据区编译后就会为它分配空间public:staticT*GetInstance(){returndata;}};只要通过 Singleton 这个包装类来使用 T 对象, 则一个进程中只有一个 T 对象的实例.饿汉式特点分析优点线程安全无需考虑多线程同步问题性能好获取实例时直接返回无锁开销实现简单代码简洁不易出错缺点启动时间可能增加程序启动时间资源浪费即使不使用也占用资源初始化顺序不同编译单元间的静态变量初始化顺序不确定适用场景单例初始化开销小单例在程序运行中必定会被使用对性能要求极高不能忍受锁开销多线程环境且不想处理同步问题3.2.2 懒汉实现方式核心思想“用时创建延迟加载”- 在第一次请求时才创建实例。templatetypenameTclassSingleton{staticT*inst;public:staticT*GetInstance(){if(instNULL){instnewT();}returninst;}};存在一个严重的问题, 线程不安全.第一次调用 GetInstance 的时候, 如果两个线程同时调用, 可能会创建出两份 T 对象的实例.但是后续再次调用, 就没有问题了懒汉式特点分析优点延迟加载只有使用时才创建节省资源启动快速不增加程序启动时间灵活性高可以根据需要动态创建缺点线程安全复杂需要处理多线程同步首次访问慢第一次获取实例需要创建和同步实现复杂需要考虑各种边界情况适用场景单例初始化开销大单例可能不会被使用系统资源有限需要按需加载对启动时间敏感的应用3.2.3 深度对比与分析内存模型分析// 饿汉式内存布局// 编译时确定在数据段分配内存// 程序加载时即初始化// 懒汉式内存布局// 运行时确定在堆上分配内存// 第一次访问时初始化线程安全性对比实现方式饿汉式懒汉式基础实现线程安全线程不安全加锁实现不需要需要锁机制双重检查不需要需要DCLP现代实现总是安全call_once或局部静态变量选择指南选择饿汉式的情况单例的创建和运行时开销非常小程序运行过程中一定会使用该单例希望避免任何锁开销单例的初始化不依赖其他未初始化的资源选择懒汉式的情况单例初始化成本高连接数据库、读取大文件等单例可能在整个程序生命周期中都不被使用单例的初始化依赖运行时信息或其他单例需要动态控制单例的创建时机3.2.4 总结特性饿汉式懒汉式哲学积极准备按需分配实现简单直接复杂但灵活线程安全天然安全需额外保障资源使用启动时占用使用时占用性能特点启动慢使用快启动快第一次慢现代推荐静态成员或局部静态变量局部静态变量(call_once)最佳实践建议优先使用基于局部静态变量的懒汉式C11及以上如果确定单例一定被使用且初始化快可以考虑饿汉式在多线程环境中避免手写双重检查锁定使用标准库提供的线程安全机制考虑是否真的需要单例评估是否有更好的设计模式替代3.3 懒汉方式实现单例模式其他的头文件都和上面一样ThreadPool:ThreadPool.cpp g-o $ $^-stdc17-lpthread.PHONY:clean clean:rm-f ThreadPool#pragmaonce#includequeue#includevector#includeThread.hpp#includeCond.hpp#includeLogger.hppusingnamespacestd;// 单例线程池 - 懒汉模式conststaticintdefault_thread_num3;templatetypenameTclassThreadPool{voidRoutine(string name){while(true){T t;{LockGuardlock(_mutex);// 如果线程池正在运行且任务队列为空// 注意一定要使用while,防止出错while(_is_runningQueueIsEmpty()){_wait_thread_num;_cond.Wait(_mutex);// 线程唤醒后执行的是这里的逻辑 如果队列为空了 就要离开循环了_wait_thread_num--;}// 如果线程池要退出且任务队列为空if(!_is_runningQueueIsEmpty()){LOG(LogLevel::INFO)线程池准备退出任务队列为空 name.c_str()退出;break;}// 此时任务队列一定不为空存在两种情况// 1. 线程池准备退出 -- 消耗历史任务// 2. 线程池没有准备退出 -- 正常工作t_task_queue.front();_task_queue.pop();// LOG(LogLevel::DEBUG) name :::: _task_queue.size();// if (!QueueIsEmpty())// {// t _task_queue.front();// //Linux上面实现的stl库队列为空的时候(size0)还可以去数据导致(size--)// //拿到了一个00 0的任务// //然后size(size_t类型的数据没有负数)就变成了一个非常大的正数队列就不为空了// //这里段错误和数组的越界访问类似 然后一直拿去数据 触发了段错误// _task_queue.pop();// }}// 此时线程已经把任务从临界资源获取到线程私有临界区 - 线程私有的栈// 处理任务时不需要再临界区内部进行并发进行效率更高t();// 规定未来的任务必须这样处理operate()重载LOG(LogLevel::DEBUG)name handler task: t.Result2String();}}private:// 将构造函数设为私有不允许用户直接创建对象ThreadPool(intthreadnumdefault_thread_num):_thread_num(threadnum),_wait_thread_num(0),_is_running(false){for(inti1;i_thread_num;i){// 方法1:// auto f std::bind(hello, this);// 方法2string namethread-to_string(i);// emplace_back()是STL容器如vector、deque、list的成员函数// 用于在容器尾部直接构造元素避免不必要的拷贝或移动。_threads.emplace_back([this](conststringname){this-Routine(name);},name);}LOG(LogLevel::INFO)thread pool obj create success;}// 禁掉拷贝构造和赋值重载ThreadPoolToperator(constThreadPoolT)delete;ThreadPool(constThreadPoolT)delete;public:voidStart(){if(_is_running)return;_is_runningtrue;for(autot:_threads)t.Start();}voidStop(){// 线程池要退出不是立刻就能退出的它要把任务队列中的任务处理完后才能退出if(!_is_running)return;_is_runningfalse;// 线程池都要退出了那些休眠的线程还休眠什么赶紧把他们全部唤醒// 处理完任务后线程池好退出if(_wait_thread_num)_cond.NotifyAll();}voidEnqueue(constTtask){// 如果线程池准备退出任务就不要入队列了if(!_is_running)return;{LockGuardlock(_mutex);_task_queue.push(task);// LOG(LogLevel::DEBUG) 一个任务入队列了;if(_wait_thread_num)_cond.NotifyOne();}}voidWait(){for(autot:_threads){t.Join();}LOG(LogLevel::INFO)thread pool wait success;}boolQueueIsEmpty(){return_task_queue.empty();}// 用static修饰的成员函数称之为静态成员函数静态成员函数没有this指针// 静态成员函数中可以访问其他的静态成员但是不能访问非静态的因为没有this指针// 静态成员函数只能访问静态成员非静态的成员函数可以访问任意的静态成员变量和静态成员函数// 地址转字符串证明多线程申请的单例都是同一个staticstd::stringToHex(ThreadPoolT*addr){charbuffer[64];snprintf(buffer,sizeof(buffer),%p,addr);returnbuffer;}// 获取单例staticThreadPoolT*GetInstance(){// A, B, c// 线程安全提高效率式的获取单例// 双重 if 判定, 避免不必要的锁竞争if(!_instance){// 外层if是为了防止获取单例后多线程申请单例时判断前还要申请锁降低效率// 保证第二次之后所有线程不用在加锁直接返回_instance单例对象LockGuardlockguard(_singleton_lock);if(!_instance){_instancenewThreadPoolT();LOG(LogLevel::DEBUG)线程池单例首次被使用创建并初始化, addr: ToHex(_instance);_instance-Start();}}else{LOG(LogLevel::DEBUG)线程池单例已经存在,直接获取, addr: ToHex(_instance);}return_instance;}~ThreadPool(){}private:// 任务队列queueT_task_queue;// 整体使用的临界资源vectorThread_threads;int_thread_num;// 线程池中线程个数int_wait_thread_num;// 线程池正在等待的线程个数// 保护线程池安全Mutex _mutex;Cond _cond;// 检测线程池是否在运行bool_is_running;// 单例中静态指针// 需要设置 volatile 关键字, 防止被编译器优化.// volatile static ThreadPoolT *_instance;// 用static修饰的成员变量称之为静态成员变量静态成员变量一定要在类外进行初始化。// 类内定义类外初始化// 添加单例模式staticThreadPoolT*_instance;staticMutex _singleton_lock;};templateclassTThreadPoolT*ThreadPoolT::_instancenullptr;templateclassTMutex ThreadPoolT::_singleton_lock;#includeTask.hpp#includeThreadPool.hpp#includememory#includetime.hintmain(){srand(time(nullptr)^getpid());EnableConsoleLogStrategy();//编译时会报错单例模式不允许用户直接创建线程池对象// std::unique_ptrThreadPoolTask tp std::make_uniqueThreadPoolTask(10);// tp-Start();intcnt10;while(cnt--){// 生产任务intxrand()%101;usleep(rand()%73);intyrand()%51;Taskt(x,y);// push到线程池中处理// 突破类域就可以访问静态成员可以通过 类名::静态成员(不需要对象就能调用)// 或者 对象.静态成员 来访问静态成员变量和静态成员函数ThreadPoolTask::GetInstance()-Enqueue(t);sleep(1);}ThreadPoolTask::GetInstance()-Stop();ThreadPoolTask::GetInstance()-Wait();return0;}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发5000建网站兴田德润

3D高斯渲染技术:从视频到实时交互场景的革命性突破 【免费下载链接】XV3DGS-UEPlugin 项目地址: https://gitcode.com/gh_mirrors/xv/XV3DGS-UEPlugin 在数字内容创作领域,将二维视频素材转化为高质量的三维交互场景一直是技术挑战的核心。XV3DG…

张小明 2026/1/3 2:36:28 网站建设

浦口国家建设部网站长沙中小企业有哪些公司

某雷赛86闭环步进驱动方案 HBS86H 86闭环电机驱动器/混合伺服驱动器。原理图PCB代码。整体方案打包。代码无错误无警告。项目概述 本文档详细分析了基于TI DSP2803x系列微控制器的嵌入式系统外设驱动代码。该代码库为DSP2803x芯片提供了完整的外设寄存器定义和基础驱动功能&am…

张小明 2026/1/3 1:09:48 网站建设

网站子页设计网站设计分析报告

Linux 时间测量与管理机制详解 1. 时间测量概述 在计算机系统中,大量的活动都依赖于时间测量,这些活动常常在用户不知情的情况下进行。例如,计算机控制台停止使用后屏幕自动关闭,是因为内核通过定时器记录自用户按键或移动鼠标后经过的时间。系统提示移除未使用文件,是程…

张小明 2026/1/1 2:59:20 网站建设

网站设计中新闻版块怎么做杭州网站建设杭州沃迩夫

测试覆盖率的时代价值 在当今快速迭代的软件开发环境中,测试覆盖率已从单纯的质量指标演变为团队工程能力的核心体现。截至2025年末,随着云原生架构和微服务普及,系统复杂度呈指数级增长,传统测试方法面临严峻挑战。对软件测试从…

张小明 2026/1/1 8:40:51 网站建设

林州市网站建设gta5单机买房子网站在建设

想要在ComfyUI中快速部署微软Florence2视觉语言模型吗?这份完整指南将帮助你在短短几分钟内掌握这个强大的多任务视觉AI工具。Florence2模型能够通过简单的文本提示执行图像描述、目标检测、分割等多种视觉任务,是处理复杂视觉问题的理想选择。 【免费下…

张小明 2025/12/31 19:19:16 网站建设

网站建设个人工作总结做网站老师

目录 具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring…

张小明 2026/1/1 0:51:37 网站建设