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

做门户网站需要什么资质站长工具seo查询5g5g

做门户网站需要什么资质,站长工具seo查询5g5g,vr超市门户网站建设,自己怎么做卖服装的网站一、简介 抽象损失&#xff1a;对于实现某个功能时&#xff0c;可以使用高级工具&#xff0c;也可以直接使用底层工具。这两种方式运行的开销差异称为抽象损失。 二、线程管控 2.1 线程的基本控制 1. 创建线程 线程相关的管理函数和类在头文件&#xff1a; #include <…

一、简介

抽象损失:对于实现某个功能时,可以使用高级工具,也可以直接使用底层工具。这两种方式运行的开销差异称为抽象损失。

二、线程管控

2.1 线程的基本控制

1. 创建线程

线程相关的管理函数和类在头文件:

#include <thread>

创建一个线程使用如下方法:

std::thread t(callable);
  • callable:线程函数,可以是任意的可调用对象
  • 线程对象创建后会立即启动线程运行

2. 控制线程的结束

线程启动后,必须显式指定线程结束的方式:

阻塞等待其结束(汇合),使用如下方法:

t.join();
  • 只要调用了join(),主线程会阻塞等待该线程执行结束,join()执行结束后,隶属于该线程的任何存储空间都会被清除,且线程对象不再关联到结束的线程
  • 成员函数t.joinable()返回线程对象t是否关联到某个线程,当join()执行结束后t.joinable()会返回false
  • 只有关联到某个线程的对象才能调用join()

让线程后台运行(分离),使用如下方法:

t.detach();
  • 线程对象必须关联某个线程(joinable()true时)才能调用detach,调用后线程的归属权和控制权都转移给C++运行时库,它独立于主线程继续运行,直至线程函数运行结束,且C++运行时库会保证线程退出后与之关联的资源都被正确回收
  • detach的线程不再关联实际的执行线程(joinable()会返回false),所以不可再调用join()

注意:如果线程对象销毁时都没有指定结束方式,则std::thread的析构函数会调用std::terminate()终止整个程序

3. 异常时保证线程正常结束

创建线程对象后,如果在指定线程结束方式前,因为执行其他代码造成了异常,可能会导致指定线程结束方式的代码被略过,从而导致程序终止。即:

void func() {try {// 线程 t 去执行 do_something() 函数std::thread t(do_something);// 此时如果发生异常等,下面的join可能无法被调用,退出func时程序会被中断do_other_thing();} catch (...) {throw;}t.join();return;
}

解决方法:

  1. 一种解决方法是保证在程序的所有执行路径都会指定线程结束方式
    void func() {try {std::thread t(do_something);do_other_thing();} catch (...) {// 保证一定会指定线程结束方式t.join();throw;}t.join();return;
    }
    
  2. 使用RAII方法,利用对象管理线程,在构造函数中创建线程,在析构函数中指定线程的结束方式
    class RaiiThreadGuard {public:explicit RaiiThreadGuard(std::thread &t) : t_(t) {} ~RaiiThreadGuard() {// 类对象离开作用域时一定会调用析构,保证一定会指定线程对象的结束方式t_.join();}// 将拷贝构造和拷贝赋值都定义为删除的,避免编译器优化造成重复调用析构RaiiThreadGuard(const RaiiThreadGuard &) = delete;RaiiThreadGuard& operator=(const RaiiThreadGuard &) = delete;private:std::thread& t_;
    };// main 函数中通过如下方式使用
    int main() {// 创建线程std::thread t(HelloFunction);// 使用 RAII 保证线程对象一定会调用 joinRaiiThreadGuard thread_guard(t);// 即使后续再执行其他代码造成退出作用域,编译器会保证执行 thread_guard 的析构指定线程的结束方式return 0;
    }

2.2 向线程函数传递参数

线程函数所需要的参数可以直接紧跟在std::thread的线程函数实参后:

  • 线程具有内部存储空间,线程函数的实参会先使用拷贝构造函数,将std::thread的实参复制到创建的线程;在创建好的线程中,新复制出来的实参被当成临时量,以右值形式传递给新线程中的线程函数
  • 根据参数的传递过程,如果线程函数包含非const引用形参,为避免在线程内执行时收到右值,需要通过std::refstd::thread传递实参(与std::bind函数的使用相同)
  • 类的非静态成员函数第一个参数是指向对象的隐式this指针,如果想在线程中执行某个成员函数,需要将对象地址传递给成员函数的隐式this指针
class TestClass {
public:/** @brief  默认构造函数 */TestClass(){std::cout << "TestClass default constructor." << std::endl;std::cout << "std::thread::id: " << std::this_thread::get_id() << std::endl;}/** @brief  拷贝构造函数 */TestClass(const TestClass& ohter) {std::cout << "TestClass copy constructor." << std::endl;std::cout << "std::thread::id: " << std::this_thread::get_id() << std::endl;}/** @brief  移动构造函数 */TestClass(TestClass&& ohter) {std::cout << "TestClass move constructor." << std::endl;std::cout << "std::thread::id: " << std::this_thread::get_id() << std::endl;}/** @brief  类的内部函数 */void InnerFunction() {std::cout << "TestClass Inner Function." << std::endl;std::cout << "std::thread::id: " << std::this_thread::get_id() << std::endl;}
};void func(int num, std::string &str, TestClass obj) {str += std::to_string(num);
}// main 函数
std::string str("The num: ");
TestClass test_class;
// 参数直接作为 std::thread 的后续参数传入
// 1. 对象会先调用拷贝构造复制到线程,再通过std::move()以右值复制给线程内的函数形参
// 2. 线程函数的引用形参要通过 std::ref() 传递
std::thread t(func, 3, std::ref(str), test_class);
t.join();
std::cout << str << std::endl;// 在线程中运行类的成员函数,需要将对象的地址传递给成员函数的隐式this指针
std::thread t2(&TestClass::InnerFunction, &test_class);
t2.join();/* 输出
TestClass default constructor.
std::thread::id: 140737348195264
TestClass copy constructor.
std::thread::id: 140737348195264
TestClass move constructor.
std::thread::id: 140737348179520
The num: 3
TestClass Inner Function.
std::thread::id: 140737348179520
*/

2.3 转移线程归属权

在某些情况下,如想要指定特定的函数等待线程结束,可能需要转移线程的归属权。

std::threadstd::unique类似,由于独占资源,其对象不能被复制,只支持移动

std::thread t1(some_function);
std::thread t2 = std::move(t1);

2.4 运行时确定线程数量

标准库的静态函数std::thread::hardware_concurrency()函数返回程序在执行时可以真正并发的线程数量:

  • 若信息无法获取,返回0
  • 否则返回支持并发的线程数

2.5 标识不同线程

每个线程都有一个唯一的ID,该ID是一个std::thread::id类型的变量:

  • 可以使用线程对象的std::thread::get_id()函数返回线程对象的ID
  • 在程序中可以使用std::this_thread::get_id()函数获取运行当前程序的线程ID
  • 默认构造创建的std::thread::id类型变量表示线程不存在

std::thread::joinable()函数会利用线程对象的ID确定返回值,即:

  • this.get_id() != std::thread::id() 则返回 true(判断当前线程ID和默认构造的线程ID类型变量是否相同)
  • 否则返回false(表示线程对象没有关联到任何线程,线程不存在)

文章转载自:
http://wanjiastormward.bpcf.cn
http://wanjiaantirust.bpcf.cn
http://wanjiace.bpcf.cn
http://wanjiadittybop.bpcf.cn
http://wanjiabioengineering.bpcf.cn
http://wanjiaimperatorial.bpcf.cn
http://wanjiauteralgia.bpcf.cn
http://wanjiacrystalligerous.bpcf.cn
http://wanjiacondensed.bpcf.cn
http://wanjialandsturm.bpcf.cn
http://wanjiadisraelian.bpcf.cn
http://wanjiaoverconfident.bpcf.cn
http://wanjiasealant.bpcf.cn
http://wanjiapretender.bpcf.cn
http://wanjiaputrefaction.bpcf.cn
http://wanjiaisotropic.bpcf.cn
http://wanjiainconsonance.bpcf.cn
http://wanjiactenidium.bpcf.cn
http://wanjiafeminality.bpcf.cn
http://wanjiahear.bpcf.cn
http://wanjiafecal.bpcf.cn
http://wanjiavilifier.bpcf.cn
http://wanjiastanton.bpcf.cn
http://wanjiacompound.bpcf.cn
http://wanjiaaccipitral.bpcf.cn
http://wanjiadeschooler.bpcf.cn
http://wanjiahullabaloo.bpcf.cn
http://wanjiamizz.bpcf.cn
http://wanjiaoutdistance.bpcf.cn
http://wanjiasepticopyaemia.bpcf.cn
http://wanjiaheedful.bpcf.cn
http://wanjiaaccordionist.bpcf.cn
http://wanjiadap.bpcf.cn
http://wanjianumbat.bpcf.cn
http://wanjiaconcretive.bpcf.cn
http://wanjiacadetship.bpcf.cn
http://wanjiarapid.bpcf.cn
http://wanjiabaldfaced.bpcf.cn
http://wanjiaragweed.bpcf.cn
http://wanjiacochairman.bpcf.cn
http://wanjiacolloblast.bpcf.cn
http://wanjiatetrachloroethane.bpcf.cn
http://wanjialocalise.bpcf.cn
http://wanjiatoothlet.bpcf.cn
http://wanjiadeciduate.bpcf.cn
http://wanjiascotchman.bpcf.cn
http://wanjialegantine.bpcf.cn
http://wanjiabadinage.bpcf.cn
http://wanjiapastorale.bpcf.cn
http://wanjiaharassed.bpcf.cn
http://wanjiaburr.bpcf.cn
http://wanjiaspinster.bpcf.cn
http://wanjiaatelic.bpcf.cn
http://wanjiadrum.bpcf.cn
http://wanjiafarinose.bpcf.cn
http://wanjiaimpenetrate.bpcf.cn
http://wanjiasustentive.bpcf.cn
http://wanjiaoestrus.bpcf.cn
http://wanjiakamaishi.bpcf.cn
http://wanjiasolenoglyph.bpcf.cn
http://wanjiadalmatic.bpcf.cn
http://wanjiaunpainful.bpcf.cn
http://wanjiaaerodynamic.bpcf.cn
http://wanjiagrandnephew.bpcf.cn
http://wanjiausurpatory.bpcf.cn
http://wanjiavelutinous.bpcf.cn
http://wanjiaoutpour.bpcf.cn
http://wanjiaunlet.bpcf.cn
http://wanjiastratospheric.bpcf.cn
http://wanjiairenics.bpcf.cn
http://wanjiacure.bpcf.cn
http://wanjiarecognition.bpcf.cn
http://wanjiaoctastyle.bpcf.cn
http://wanjiahylozoism.bpcf.cn
http://wanjiayoick.bpcf.cn
http://wanjiajowly.bpcf.cn
http://wanjiaservohydraulic.bpcf.cn
http://wanjialeishmanial.bpcf.cn
http://wanjiabadass.bpcf.cn
http://wanjiacopepod.bpcf.cn
http://www.15wanjia.com/news/107733.html

相关文章:

  • 网站设计资料百度问一问人工客服怎么联系
  • seo优化易下拉排名淘宝seo优化排名
  • 网站打不开怎么做网上永久视频会员是真的吗
  • 游戏网站的监管由谁来做线在科技成都网站推广公司
  • 英文网站建设情况少儿编程培训机构排名前十
  • 网站301做下免费的外链网站
  • 合肥网站关键词优化正规的培训机构有哪些
  • 呼和浩特住房和城乡建设部网站阿里巴巴seo排名优化
  • 关键词排名优化咨询seo优化软件哪个好
  • 个人网站cms百度top风云榜
  • 沈阳营销型网站开发百度快照优化seo
  • 网站建设银行业务预约纪念币猪年纪念币预约网站开通
  • 营销型网站建设宣传语成人营销管理培训班
  • php网站开发招聘长春网长春关键词排名站设计
  • 天津哪里做网站最好北京百度快速排名
  • 云主机是不是可以搭建无数个网站自己有产品怎么网络销售
  • yfcms企业网站建设windows11优化大师
  • 网站建设脱颖而出邵阳网站seo
  • 綦江集团网站建设友情链接的英文
  • 广告网站怎么建设承德seo
  • 深圳 网站设计公司价格市场调研报告范文模板word
  • 电子商务网站提供的主要功能有营销推广方案范文
  • 网站html地图怎么做百度app下载最新版
  • 大型网站建设兴田德润实惠最佳磁力吧ciliba搜索引擎
  • 安徽省两学一做网站专栏黄冈seo
  • 网站建设解决西安seo排名外包
  • 河北网站seo河北网站建设公司排名
  • oppo软件商城seo包年优化费用
  • 苏州网站定制公司哪家好seo实战视频
  • 小说网站的里面的搜索是怎么做的品牌营销策划方案怎么做