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

写过太原的网站网站制作新手

写过太原的网站,网站制作新手,学服装设计培训哪里好,深圳市建设工程质量检测中心网站1 线程基本管控 每个C程序都含有至少一个线程#xff0c;即运行main()的线程#xff0c;它由C运行时系统启动。随后程序可以发起更多线程#xff0c;它们以别的函数作为入口。这些新线程连同起始线程并发运行。当main()返回时#xff0c;程序就会退出#xff1b;同样程序都含有至少一个线程即运行main()的线程它由C运行时系统启动。随后程序可以发起更多线程它们以别的函数作为入口。这些新线程连同起始线程并发运行。当main()返回时程序就会退出同样当入口函数返回时对应的线程随之终结。如果借std::thread对象管控线程即可选择等他结束。 1.1 发起线程 线程通过构造std::thread对象而启动该对象指明线程要运行的任务。 void do_some_work(); std::thread myThread(do_some_work); 任何可调用类型都适用于std::thread。所以作为代替可以设计一个带有函数调用操作符的类应当是下面的operator class background_task { public:void operator() () const{do_something();do_something_else();} };background_task f; std::thread my_thread(f); f被复制到属于新线程的存储空间中在那里被调用由新线程执行。 1.1.1 与函数声明进行区分 如果传入std::thread的是临时变量不是具名变量那么调用构造函数的语法有可能与函数声明相同。这种情况编译器会将其解释成函数声明。 声明为函数函数名为my_thread只接收一个参数返回std::thread对象 std::thread my_thread(background_task());可以通过多用一对圆括号或使用新式的统一初始化语法 std::thread my_thread((background_task())); std::thread my_thread{background_task()};还可以使用lambda表达式 std::thread my_thread([]{do_something();do_something_else(); }); 1.2 汇合与分离 在启动线程后需要明确是要等待他结束也就是汇合还是任由他独立运行也就是分离。如果等到std::thread销毁的时候还没有决定好那么std::thread的析构函数将调用std::terminate()终止整个程序。 如果选择了分离且分离时新线程还未运行结束那将继续运行甚至在std::thread对象销毁很久之后依然运行它只有最终从线程函数返回时才会结束运行。 假设程序不等待线程结束那么在线程运行结束前我们要保证它所访问的外部数据始终正确有效。由于使用多线程所以我们可能会经常面临对象生存期的问题。比如下面的案例 struct func {int i;func(int i_):i(i_){}void operator() (){for (unsigned j0; j1000000; j) {do_something(i); 隐患可能访问悬空引用}} };void oops() {int some_local_state0;func my_func(some_local_state);std::thread my_thread(my_func);my_thread.detach(); 不等待新线程结束新线程可能仍运行而主线程的函数却已经结束 } 主线程新线程构造my_func对象引用局部变量some_local_state通过my_thread对象启动新线程新线程启动调用func::operator()分离新线程my_thread 运行func::operator(); 调用do_something()函数 进而引用局部变量some_local_state 销毁局部变量some_local_state 仍在运行 退出oops() 继续运行func::operator(); 调用do_something()函数 进而引用some_local_state, 导致未定义行为 因此以下做法不可取意图在函数中创建线程并让线程访问函数的局部变量。除非线程肯定会在该函数退出前结束。或者是汇合新线程此举可以保证在主线程的函数退出前新线程执行完毕。 1.2.1 join—等待线程完成 若需等待线程完成那么可以在与之关联的std::thread实例上通过调用成员函数join()实现。对于上面的代码就是把detach换成join。就能够保证在oops退出前新线程结束。 对于一个线程join仅能被调用一次被调用后线程不再可汇合成员函数joinable将返回false。 要注意如果线程启动后有异常抛出而join尚未执行该join调用会被略过。 使用thread_guard保证在抛出异常时退出路径的先后顺序与不抛出异常时一致。 也就是在析构函数中调用join class thread_guard {std::thread t; public:explicit thread_guard(std::thread t_) : t(t_){}~thread_guard() {if (t.joinable()) {t.join();}}thread_guard(thread_guard const)delete;thread_guard operator(thread_guard const)delete; };struct func {int i;explicit func(int i_) : i(i_) {};void operator() () {for (unsigned j 0; j 1000000; j) {do_somthing();}} };void f() {int some_local_state0;func my_func(some_local_state);std::thread t(my_func);thread_guard g(t);do_something_in_current_thread(); } 1.2.2 detach—在后台运行线程 会令线程在后台运行因此与之无法直接通信。其归属权和控制权都交给了C运行时库由此保证一旦线程退出与之关联的资源都会被正确回收。 只有在joinable返回true时才能调用detach。 2 向线程函数传递参数 直接向std::thread的构造函数增添更多参数即可。需要注意的是线程具有内部存储空间参数会按照默认方式先复制到该处新创建的执行线程才能直接访问它们。然后这些副本被当成临时变量以右值的形式传给新线程上的函数或可调用对象。即便函数相关参数按设想应该是引用上述过程依然会发生。 void f(int i, std::string const s); std::thread t(f, 3, hello);void f(int i, std::string const s); void oops(int some_param) {char buffer[1024];sprintf(buffer, %i, some_param);std::thread t(f, 3, buffer);// std::thread t(f, 3, std::string(buffer));t.detach(); } 但是上述例子将字符串的引用复制到了thread的存储空间当调用thread的外层函数销毁时,buffer将不存在无法访问这个引用。可以使用注释里的方法先转换成std::string对象buffer相当于一个指针 void update_data_for_widget(widget_id w, widget_data data); void oops_again(widget_id w) {widget_data data;std::thread t(update_data_for_widget, w, data);display_status();t.join();process_widget_data(data); } 根据update_data_for_widget函数的声明第二个参数会以引用的方式传入update_data_for_widget但是std::thread的构造函数并不知情会直接复制提供的值。随后线程库内部会把参数副本当成move-only只移型别以右值的形式传递。最终update_data_for_widget会收到右值因为update_data_for_widget预期接受非const引用我们不能向他传递右值。 解决方法是按照如下方式改写std::ref std::thread t(update_data_for_widget, w, std::ref(data)); 这样就保证了传入update_data_for_widget函数的不是变量data的临时副本而是指向变量data的引用因此能够编译成功。 2.2 调用对象的方法 若要调用一个对象对应的方法则需要传递方法地址和对象地址第三个参数作为该方法的第一个入参。 class X { public:void do_lengthy_work();}; X my_x; std::thread t(X::do_lengthy_work, my_x); 上述代码调用对象my_x的do_lengthy_work方法。 2.3 只能移动的方式传递参数 3 移交线程归属权
http://www.w-s-a.com/news/735007/

相关文章:

  • 描述对于营销型网站建设很重要飘红效果更佳教育培训排行榜前十名
  • 国外网站有哪些推荐的网站按关键词显示广告图片
  • 互联网招聘网站排名手机网站系统
  • 网站与云平台区别企业网站建设有什么要求
  • wordpress福利网站源码高端网站设计培训机构
  • 网站建设找客户招标网免费
  • 东莞食品网站建设扬州市住房建设局网站
  • 网站色彩心理建设网站的主要功能有哪些
  • 营销型网站建设运营企业宣传网页设计
  • 建设银行官方网站网址sem搜索
  • 简述建设网站的具体步骤网络建设方案ppt
  • 自建门户网站建设工程质量监理协会网站
  • 为企网站版面设计经历了哪几个阶段
  • 如何直到网站是用什么模板做的怎么在外贸公司拿订单
  • 网站专题制作酒店网站建设考虑的因素
  • 苏州招聘网站建设潍坊网站建设wfxtseo
  • 手机网站特效做互联网平台要多少钱
  • 做网站广告推广平台旅游网站后台管理系统
  • ppt模板下载免费素材网站php网站开发平台下载
  • 网站推广策划报告航空航天可以做游戏可以视频约会的网站
  • 云南建设学院的网站划分切片来做网站
  • 建设视频网站需要什么知识辽阳建设网站
  • 提供o2o网站建设打扑克网站推广软件
  • 制作简单门户网站步骤中国建设局网站查询
  • 漳州专业网站建设网站建设的面试要求
  • 有哪些网站是封面型汕头网站上排名
  • 自动优化网站软件没有了做的新网站做百度推广怎么弄
  • 高陵县建设局网站商标查询网站
  • 郑州建设网站哪家好东莞网络公司排行榜
  • 成都网站开发费用做行程的网站