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

网站页面设计具体步骤怎么在云服务器上搭建网站

网站页面设计具体步骤,怎么在云服务器上搭建网站,昆明cms建站模板,成都网站建设与网站推广培训理解线程池 C 文章目录 理解线程池 C程序源码知识点emplace_back 和 push_back有什么区别#xff1f;互斥锁 mutexcondition_variablestd::move()函数bind()函数join 函数 线程池的原理就是管理一个任务队列和一个工作线程队列。 工作线程不断的从任务队列取任务#xff0c;然…理解线程池 C 文章目录 理解线程池 C程序源码知识点emplace_back 和 push_back有什么区别互斥锁 mutexcondition_variablestd::move()函数bind()函数join 函数 线程池的原理就是管理一个任务队列和一个工作线程队列。 工作线程不断的从任务队列取任务然后执行。如果没有任务就等待新任务的到来。添加新任务的时候先添加到任务队列然后通知任意(条件变量notify_one/notify_all)一个线程有新的任务来了。 优势包括 资源管理线程池有效地管理线程的创建、销毁和重用避免了频繁创建和销毁线程的开销节省了系统资源。 减少线程创建时间线程创建和销毁是开销较大的操作。线程池在初始化时创建一组线程并将它们保持在就绪状态从而在需要时可以快速执行任务而不必每次都重新创建线程。 任务队列线程池通常与任务队列结合使用任务可以被提交到队列中线程池中的线程会按照队列中任务的顺序依次执行确保了任务的有序执行。 限制并发数线程池可以限制并发执行的任务数量以避免系统资源过度占用提高系统稳定性。 节省内存线程池的线程可以被重复使用避免了频繁创建线程的内存占用。 应用场景包括 服务器应用线程池在服务器应用中常用来处理客户端请求。当服务器需要处理大量的连接请求时线程池可以有效地复用线程提高服务器性能。 I/O密集型任务线程池适用于I/O密集型任务如文件读写、网络通信等。在这些情况下线程可以在I/O操作等待时执行其他任务提高了系统的效率。 并行计算线程池可以用于并行计算将任务拆分为多个子任务由线程池中的线程并行执行加速计算过程。 定时任务线程池可用于执行定时任务例如定期备份数据、清理日志等。 多任务并行处理当需要处理多个任务但不想为每个任务创建一个线程时线程池是一种有效的方式。它可以控制并发任务的数量从而避免系统过度负载。 程序源码 class ThreadPool {public:// 构造函数传入线程数ThreadPool(size_t);template class F, class... Argsauto enqueue(F f, Args... args)- std::futuretypename std::result_ofF(Args...)::type;~ThreadPool();private:// 线程组std::vectorstd::thread workers;// 任务队列std::queuestd::functionvoid() tasks;// synchronizationstd::mutex queue_mutex; //互斥锁std::condition_variable condition;//条件变量bool stop;//停止标志 };// the constructor just launches some amount of workers inline ThreadPool::ThreadPool(size_t threads) : stop(false) {for (size_t i 0; i threads; i)//thread 禁用了拷贝构造和赋值运算因此这边最好用emplace_backworkers.emplace_back([this] {for (;;) { //死循环的作用是一直让线程执行任务直至结束std::functionvoid() task;{std::unique_lockstd::mutex lock(this-queue_mutex);// 如果线程终止了 或者 任务队列不为空 就等待this-condition.wait(lock, [this] { return this-stop || !this-tasks.empty(); });// 如果线程终止了 且 任务队列空了 函数结束if (this-stop this-tasks.empty()) return;task std::move(this-tasks.front());this-tasks.pop();}task();}}); }// add new work item to the pool template class F, class... Args auto ThreadPool::enqueue(F f, Args... args)- std::futuretypename std::result_ofF(Args...)::type {using return_type typename std::result_ofF(Args...)::type;auto task std::make_sharedstd::packaged_taskreturn_type() (std::bind(std::forwardF(f), std::forwardArgs(args)...));std::futurereturn_type res task-get_future();{std::unique_lockstd::mutex lock(queue_mutex);// dont allow enqueueing after stopping the poolif (stop) throw std::runtime_error(enqueue on stopped ThreadPool);tasks.emplace([task]() { (*task)(); });}condition.notify_one();return res; }// the destructor joins all threads inline ThreadPool::~ThreadPool() {{std::unique_lockstd::mutex lock(queue_mutex);stop true;}condition.notify_all();for (std::thread worker : workers) worker.join(); }知识点 emplace_back 和 push_back有什么区别 《c primer》书里说明 1.当调用push或insert成员函数时我们将元素类型的对象传递给它们这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。 2.其中对emplace_back的调用和第二个push_back调用都会创建新的Sales_data对象。在调用emplace_back时会在容器管理的内存空间中直接创建对象。而调用push_back则会创建一个局部临时对象 3.标准库容器的emplace_back成员是一个可变参数成员模板而push_back只能传入单个参数 总结就是emplace_back资源消耗更小不会创建临时对象同事可以进行多参数的传入应用于像vector中T有多个参数的场景。 互斥锁 mutex 一种同步原语用于多线程管理确保临界资源只有一个线程访问其中mtx.lock()表示上锁mtx.unlock()表示解锁。上述线程池中为什么没有unlock呢因 std::unique_lockstd::mutex 这个智能指针在退出{}代码块之后就会自动销毁。 condition_variable condition_variable 条件变量是一种对象能够阻止调用线程直到收到通知才能恢复。一般配合 unique_lock 一起使用。当其中一个等待函数被调用时线程保持阻塞状态直到被另一个线程唤醒该线程在同一condition_variable对象上调用通知函数。 //通过notify_one或者notify_all进行唤醒 void wait (unique_lockmutex lck); //只有pred返回false时才会阻塞pred变为true时才能被唤醒 void wait (unique_lockmutex lck, Predicate pred);std::move()函数 左值变右值可以参考C 左值右值以及std::move函数解释 bind()函数 每个参数可以绑定到一个值或者作为占位符 如果绑定到一个值调用返回的函数对象将总是使用该值作为参数。如果作为占位符调用返回的函数对象将转发传递给调用的参数由占位符指定顺序号 double my_divide (double x, double y) {return x/y;}int main () {auto fn_five std::bind (my_divide,10,2); // returns 10/2std::cout fn_five() \n; // 5auto fn_half std::bind (my_divide,_1,2); // returns x/2std::cout fn_half(10) \n; // 5auto fn_invert std::bind (my_divide,_2,_1); // returns y/xstd::cout fn_invert(10,2) \n; // 0.2auto fn_rounding std::bindint (my_divide,_1,_2); // returns int(x/y)std::cout fn_rounding(10,3) \n; // 3 }join 函数 C中用于线程同步的一个方法它通常用于等待一个线程的执行完成。当你创建一个线程并希望等待它完成执行。 int main() {std::thread t1(foo);std::thread t2(bar);t1.join(); // 主线程等待 t1 完成t2.join(); // 主线程等待 t2 完成std::cout Both threads have finished! std::endl;return 0; }
http://www.w-s-a.com/news/625561/

相关文章:

  • 南宁模板建站多少钱企业黄页名单
  • 企业网站的建设一般要素有网站定制公司地址
  • 婚纱摄影网站设计案例四川省城乡建设厅官方网站
  • 怎么做海淘网站wordpress首页表单
  • 大连网站优化技术长沙高端网站建设服务
  • 郎创网站建设做的网站 v2ex
  • 广东网站建设教程江西城乡住房建设网站
  • 做ppt卖给网站wordpress insert
  • 文化传媒公司网站模板wordpress转typecho
  • 网站建设设计视频郑州 服装网站建设
  • 网站建设什么公司好织梦cms默认密码
  • 大型网站 空间网上商城官网入口
  • 成都全美网站建设江苏专业网站建设
  • 足球网站模板有帮忙做阿里巴巴网站的吗
  • 建设厅报名网站京东网站的建设与发展前景
  • 金寨县住房和城乡建设部网站网页作业怎么做一个网站
  • 做ppt模板网站有哪些内容wap是什么意思卡老师
  • 网站建设一定要域名吗网站后台关键词设置
  • 标书制作公司网站坪山网站建设哪家便宜
  • 防止做网站的人修改数值门户网站架构
  • 电子项目外包网站考二建需要什么学历和专业
  • 做网站推广引流效果好吗电商推广技巧
  • 亦庄网站建设价格广州网站推广服务
  • 十大免费ppt网站下载重庆在线高校平台登录
  • 做环保网站案例百度seo教程
  • 体育用品网站模板网站建设话术
  • 潍坊网站建设服务商做网站多久能盈利
  • 嘉定区做网站房产信息查询官网
  • 网站直播间 是怎么做的唐山论坛建站模板
  • 深圳洲聚网站建设wordpress 泛解析