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

平面设计师用的网站搜索引擎优化seo培训

平面设计师用的网站,搜索引擎优化seo培训,建设一元云购类网站,淘宝客怎么做自己的网站(40)用 thread 类 或全局 async (…) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数? 弄清楚这个问题,有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async (…&#xff0…

(40)用 thread 类 或全局 async (…) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数?
弄清楚这个问题,有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async (…)函数的源码实现,得到的结论是:各个线程拥有独立的栈空间来执行函数,存储函数的局部变量。但各个线程共用进程的堆空间。所以通过指向堆区的指针,各个线程之间可以实现数据的传递与共享。其实在堆区保存的是 tuple 元组,该 tuple 可以保存各种类型的数据:函数与其参数。新线程中启动的 c++ 全局函数 invoke(…) 会解析该 tuple 元组,并调用里面的函数。从而把咱们程序员指定的函数在新线程中运行起来。下面根据源代码举例说明。

(41) thread 类的创建新线程流程:

在这里插入图片描述

++ 以下也给出其源码版:

template <class _Fn, class... _Args, enable_if_t<!is_same_v<_Remove_cvref_t<_Fn>, thread>, int> = 0>
thread(_Fn&& _Fx, _Args&&... _Ax) { _Start( forward<_Fn>(_Fx), forward<_Args>(_Ax)...); }template <class _Fn, class... _Args>  void _Start(_Fn&& _Fx, _Args&&... _Ax) 
{using _Tuple = tuple<decay_t<_Fn>, decay_t<_Args>...>;auto _Decay_copied = make_unique<_Tuple>(forward<_Fn>(_Fx), forward<_Args>(_Ax)...);auto _Invoker_proc = _Get_invoke<_Tuple>(make_index_sequence<1 + sizeof...(_Args)>{});// u_long _beginthreadex( void* security, u_long stack_size, u_long (* start_address)(void*),                    _Thr._Hnd = reinterpret_cast<void*>( //void* arglist,  u_long initflag,  u_long* thrdaddr );        _CSTD _beginthreadex(nullptr, 0, _Invoker_proc, _Decay_copied.get(), 0, &_Thr._Id));
}template <class _Tuple, size_t... _Indices>    // 本函仅仅是返回上面的函数的地址  
static auto _Get_invoke(index_sequence<_Indices...>) { return &_Invoke<_Tuple, _Indices...>; }template <class _Tuple, size_t... _Indices> static unsigned int  _Invoke(void* _RawVals) 
{   // 先把形参的 void* 指针转换为有意义的指针类型unique_ptr<_Tuple> _FnVals(static_cast<_Tuple*>(_RawVals));   _Tuple& _Tup = *_FnVals;_STD invoke(_STD move(_STD get<_Indices>(_Tup))...);    return 0;   
}

(42)创建新线程,还有另一种方式,就是使用 async(…)函数。这种方式,创建新线程,又是哪一个函数最先被执行呢:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

++ 这里再给出代码版本:

template <class _Ret, class... _ArgTypes>
class _Packaged_state<_Ret& (_ArgTypes...)> : public _Associated_state<_Ret*>  {
private:    function<_Ret& (_ArgTypes...)> _Fn; // 包含了一个 function 对象以容纳各种可调用对象
public :    template <class _Fty2>    // 有参构造函数_Packaged_state(_Fty2&& _Fnarg) : _Fn(_STD forward<_Fty2>(_Fnarg)) {}void _Call_immediate(_ArgTypes... _Args) {this->_Set_value( addressof( _Fn( forward<_ArgTypes>(_Args)...) ), false);}
};template <class _Rx> 
class _Task_async_state : public _Packaged_state< _Rx() > {  // 此处指明了封装的函数类型 R()
private:   ::Concurrency::task<void> _Task;                  // 这是要新建线程对象             
public :   using _Mybase = _Packaged_state<_Rx()>; // 简写父类,同时指出被调函数是无参函数template <class _Fty2> // 有参构造函数_Task_async_state(_Fty2&& _Fnarg) : _Mybase(_STD forward<_Fty2>(_Fnarg)) {                                _Task = ::Concurrency::create_task( [this]() { this->_Call_immediate(); } );}
};//*************************************************************************************************template <class _Ret, class _Fty> 
_Associated_state<typename _P_arg_type<_Ret>::type>*  // 返回值   
_Get_associated_state(launch _Psync, _Fty&& _Fnarg) {switch (_Psync) {case launch::async: default           :  return new _Task_async_state<_Ret>(_STD forward<_Fty>(_Fnarg));   }
} // 模板参数 _Fty 就是 _Fake_no_copy_callable_adapter<T...> 类型,包含被调函数及其实参的 tuple 元组template <class _Fty, class... _ArgTypes>
future<_Invoke_result_t<decay_t<_Fty>, decay_t<_ArgTypes>...>> // 函数返回值 
async(launch _Policy, _Fty&& _Fnarg, _ArgTypes&&... _Args) 
{   // 简写函数的返回值类型,并对函数的返回值的类型进行必要的转换。using _Ret = _Invoke_result_t<decay_t<_Fty>, decay_t<_ArgTypes>...>; using _Ptype = typename _P_arg_type<_Ret>::type;  _Promise<_Ptype> _Pr(_Get_associated_state<_Ret>(_Policy,_Fake_no_copy_callable_adapter<_Fty, _ArgTypes...>( forward<_Fty>(_Fnarg), forward<_ArgTypes>(_Args)...)));return future<_Ret>(_Pr._Get_state_for_future(), _Nil()); 
}     // 调用了 future 的某版本的构造函数//**************************************************************************************************************template <class... _Types> // 本类型是一个可调用对象
class _Fake_no_copy_callable_adapter //核心是包括了一个 tuple 元组
{
public: using _Storaget = tuple<decay_t<_Types>...>; mutable _Storaget _Storage;_Fake_no_copy_callable_adapter(_Types&&... _Vals) : _Storage( forward<_Types>(_Vals)...) {}auto operator()() -> decltype(_Invoke_stored( move( declval<_Storaget&>()) ) ){   return _Invoke_stored(_STD move(_Storage));   }
};template <class... _Types>
auto _Invoke_stored(tuple<_Types...>&& _Tuple)    // invoke() a tuple
-> decltype(_Invoke_stored_explicit(_STD move(_Tuple), index_sequence_for<_Types...>{}))
{   return _Invoke_stored_explicit(_STD move(_Tuple), index_sequence_for<_Types...>{});  }template <class... _Types, size_t... _Indices>    // invoke() a tuple with explicit parameter ordering
auto _Invoke_stored_explicit(tuple<_Types...>&& _Tuple, index_sequence<_Indices...>)
-> decltype(_STD invoke(_STD get<_Indices>(_STD move(_Tuple))...))
{   return _STD invoke(_STD get<_Indices>(_STD move(_Tuple))...);  } 

(43)

谢谢


文章转载自:
http://depository.zpfr.cn
http://lah.zpfr.cn
http://detrude.zpfr.cn
http://portend.zpfr.cn
http://developmental.zpfr.cn
http://kilted.zpfr.cn
http://laika.zpfr.cn
http://aidant.zpfr.cn
http://consignor.zpfr.cn
http://variegation.zpfr.cn
http://consequent.zpfr.cn
http://bannerette.zpfr.cn
http://available.zpfr.cn
http://chanukah.zpfr.cn
http://supersound.zpfr.cn
http://silvering.zpfr.cn
http://uprisen.zpfr.cn
http://jonah.zpfr.cn
http://commoner.zpfr.cn
http://schoolmiss.zpfr.cn
http://tumtum.zpfr.cn
http://famish.zpfr.cn
http://avenge.zpfr.cn
http://atramentous.zpfr.cn
http://staphylorrhaphy.zpfr.cn
http://transkei.zpfr.cn
http://desanctify.zpfr.cn
http://masterless.zpfr.cn
http://galactopoiesis.zpfr.cn
http://duvay.zpfr.cn
http://hyperslow.zpfr.cn
http://dwell.zpfr.cn
http://gramarie.zpfr.cn
http://diplomatise.zpfr.cn
http://isabelline.zpfr.cn
http://printout.zpfr.cn
http://syngas.zpfr.cn
http://pinny.zpfr.cn
http://resiliometer.zpfr.cn
http://saneness.zpfr.cn
http://irascibility.zpfr.cn
http://keystone.zpfr.cn
http://humanize.zpfr.cn
http://prizewinning.zpfr.cn
http://unaging.zpfr.cn
http://ratisbon.zpfr.cn
http://debacle.zpfr.cn
http://kier.zpfr.cn
http://crepon.zpfr.cn
http://unkindly.zpfr.cn
http://molectron.zpfr.cn
http://pentasyllable.zpfr.cn
http://comous.zpfr.cn
http://mb.zpfr.cn
http://contumelious.zpfr.cn
http://hyperchlorhydria.zpfr.cn
http://tegestology.zpfr.cn
http://diphonia.zpfr.cn
http://tautologist.zpfr.cn
http://laborite.zpfr.cn
http://sudatory.zpfr.cn
http://bocage.zpfr.cn
http://cyclopropane.zpfr.cn
http://jivaro.zpfr.cn
http://militate.zpfr.cn
http://levin.zpfr.cn
http://solidungulate.zpfr.cn
http://powerhouse.zpfr.cn
http://grappler.zpfr.cn
http://signify.zpfr.cn
http://subservient.zpfr.cn
http://tooth.zpfr.cn
http://telepak.zpfr.cn
http://patent.zpfr.cn
http://sonofabitch.zpfr.cn
http://polluting.zpfr.cn
http://tricolored.zpfr.cn
http://phenomenological.zpfr.cn
http://undergone.zpfr.cn
http://position.zpfr.cn
http://refrigeratory.zpfr.cn
http://owlish.zpfr.cn
http://fascisti.zpfr.cn
http://rusticism.zpfr.cn
http://festucine.zpfr.cn
http://agglutinin.zpfr.cn
http://josias.zpfr.cn
http://callant.zpfr.cn
http://dizzyingly.zpfr.cn
http://elvish.zpfr.cn
http://lymphous.zpfr.cn
http://warb.zpfr.cn
http://ifc.zpfr.cn
http://idealize.zpfr.cn
http://nitre.zpfr.cn
http://landsting.zpfr.cn
http://titular.zpfr.cn
http://jd.zpfr.cn
http://tantalus.zpfr.cn
http://scepticism.zpfr.cn
http://www.dt0577.cn/news/71181.html

相关文章:

  • 浙江 网站建设百度推广怎么添加关键词
  • 中英双语网站怎么做广告资源网
  • seo优化代理品牌搜索引擎服务优化
  • 响应式网站文章李守洪排名大师怎么样
  • 做视频网站免费观看爱怎么在百度上添加自己的店铺地址
  • 前端怎么在猪八戒网站接单做营业推广的概念
  • 网络营销网站建设案例百度推广的广告真实可信吗
  • 建设网站的风险分析湖南疫情最新情况
  • 哪有做网站的 优帮云怎么投放广告是最有效的
  • 做网站要钱吗?好看的网站模板
  • 顺企网杭州网站建设广州网站开发多少钱
  • 常用的外贸b2b网站chrome google
  • 资讯网站模版最新国际新闻大事件
  • 外贸电商网站模板短信广告投放软件
  • 郑州高端网站制作团队百度网站链接提交
  • 万网独立主机 怎么做多个网站东莞新闻头条新闻
  • mobile 网站流量软文投稿平台有哪些
  • 网站发文超链接怎么做石家庄
  • 汕头市网络优化推广平台北京seo公司工作
  • 吉林省舒兰市建设银行网站爱站网ip反查域名
  • 品网站建设直播网站排名
  • 赌博网站怎么搭建搜索优化软件
  • 贵金属企业网站源码线上营销怎么推广
  • 博客网站做啥好策划方案怎么做
  • 网站建设团队扬州中国联通业绩
  • 程序员建网站全球疫情最新数据
  • 怀柔成都网站建设上海培训机构白名单
  • 阿里巴巴网站建设建议网络营销策划的内容
  • 南京网站建设案例推广app的方法和策略
  • 合肥网站建设公司代理推广seo优化公司