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

网站建设网络合同/360渠道推广系统

网站建设网络合同,360渠道推广系统,天津招投标 天津建设工程信息网,企业电子商务网站开发在编写多线程程序时,运行多少线程比较合适呢?线程并不是越多越好,理论上,硬件支持多少线程数,就开多少个线程比较合适,有的比如完成端口IOCP中建议开2倍线程数,因为考虑到有些线程可能会挂起等情…

在编写多线程程序时,运行多少线程比较合适呢?线程并不是越多越好,理论上,硬件支持多少线程数,就开多少个线程比较合适,有的比如完成端口IOCP中建议开2倍线程数,因为考虑到有些线程可能会挂起等情况。但最重要的一条,首先要获取当前硬件支持的线程数,通常情况下为CPU核数。

std::thread::hardware_concurrency();    //获取当前CPU核心数量

代码示例:
以下代码为std::accumulate的简单并行版本实现,通过将大量的累加操作,分配给多个线程去计算,最后将各个线程计算的结果累加,得出最终结果。真正的并行计算任务分割是很麻烦的,这里并不需要考虑线程的同步等问题。

template<typename Iterator,typename T>
struct accumulate_block
{void operator()(Iterator first,Iterator last,T& result){result = std::accumulate(first,last,result);}
};template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{unsigned long const length=std::distance(first,last);if(!length)return init;unsigned long const min_per_thread=25;unsigned long const max_threads=(length+min_per_thread-1)/min_per_thread;   //获取最大线程数量unsigned long const hardware_threads=std::thread::hardware_concurrency();   //获取当前CPU核心数量unsigned long const num_threads=std::min(hardware_threads!=0?hardware_threads:2,max_threads);//运行线程数量unsigned long const block_size=length/num_threads;std::vector<T> results(num_threads);Iterator block_start=first;std::vector<std::thread> v_threads(num_threads-1);for(unsigned long i=0;i<num_threads-1;++i){Iterator block_end=block_start;std::advance(block_end,block_size);v_threads[i]=std::thread(accumulate_block<Iterator,T>(),block_start,block_end,std::ref(results[i]));block_start=block_end;}accumulate_block<Iterator,T>()(block_start,last,results[num_threads-1]);    //计算剩下的数,相当于在主线程中计算std::for_each(v_threads.begin(),v_threads.end(),std::mem_fn(&std::thread::join));//等待所有线程计算完成return std::accumulate(results.begin(),results.end(),init);
}int _tmain(int argc, _TCHAR* argv[])
{std::vector<int> v(100000);std::iota(v.begin(),v.end(),1);long long sum=parallel_accumulate(v.begin(),v.end(),0);cout<<"sum="<<sum<<endl;return 0;
}

相关STL源码:

//std::distance源码
template<class _BidIt,class _Diff> inlinevoid _Distance2(_BidIt _First, _BidIt _Last, _Diff& _Off,bidirectional_iterator_tag){   // add to _Off distance between bidirectional iterators (redundant)for (; _First != _Last; ++_First)++_Off;}template<class _InIt> inlinetypename iterator_traits<_InIt>::difference_typedistance(_InIt _First, _InIt _Last){   // return distance between iteratorstypename iterator_traits<_InIt>::difference_type _Off = 0;_Distance2(_First, _Last, _Off, _Iter_cat(_First));return (_Off);}
//std::advance源代码// TEMPLATE FUNCTION advance
template<class _InIt,class _Diff> inlinevoid _Advance(_InIt& _Where, _Diff _Off, input_iterator_tag){   // increment iterator by offset, input iterators#if _ITERATOR_DEBUG_LEVEL == 2if (_Off < 0)_DEBUG_ERROR("negative offset in advance");#endif /* _ITERATOR_DEBUG_LEVEL == 2 */for (; 0 < _Off; --_Off)++_Where;}template<class _FwdIt,class _Diff> inlinevoid _Advance(_FwdIt& _Where, _Diff _Off, forward_iterator_tag){   // increment iterator by offset, forward iterators#if _ITERATOR_DEBUG_LEVEL == 2if (_Off < 0)_DEBUG_ERROR("negative offset in advance");#endif /* _ITERATOR_DEBUG_LEVEL == 2 */for (; 0 < _Off; --_Off)++_Where;}template<class _BidIt,class _Diff> inlinevoid _Advance(_BidIt& _Where, _Diff _Off, bidirectional_iterator_tag){   // increment iterator by offset, bidirectional iteratorsfor (; 0 < _Off; --_Off)++_Where;for (; _Off < 0; ++_Off)--_Where;}template<class _RanIt,class _Diff> inlinevoid _Advance(_RanIt& _Where, _Diff _Off, random_access_iterator_tag){   // increment iterator by offset, random-access iterators_Where += _Off;}template<class _InIt,class _Diff> inlinevoid advance(_InIt& _Where, _Diff _Off){   // increment iterator by offset, arbitrary iterators_Advance(_Where, _Off, _Iter_cat(_Where));}
//获取硬件线程数量static unsigned int hardware_concurrency() _NOEXCEPT{   // return number of hardware thread contextsreturn (::Concurrency::details::_GetConcurrency());}
http://www.lbrq.cn/news/1474525.html

相关文章:

  • 手机触屏网站制作软件/做一个网站要花多少钱
  • 部门做网站优点/整站优化多少钱
  • 做冷冻食品的网站/seo网站内容优化有哪些
  • 卢松松网站的百度广告怎么做的/小红书关键词排名怎么做
  • 郑州手机网站建设公司排名/如何做优化排名
  • 自己做直播网站/补肾壮阳吃什么药效果好
  • 做公司网站的流程/百度人工服务24小时电话
  • 做外贸一般用哪些网站好/网络营销的模式有哪些?
  • c可以做网站吗/百度竞价推广效果怎么样
  • 易维云 建站abc/最吸引人的引流话术
  • 河北区做网站公司/网络推广平台有哪些?
  • 富阳公司做网站/营销渠道策略有哪些
  • wordpress改logo不显示不出来/肇庆seo按天收费
  • 有没有网站做字体变形/河南郑州网站推广优化外包
  • 厦门网站建设招标/不属于网络推广方法
  • 网站建设交印花税嘛/新的网站怎么推广
  • 政府网站建设招标/爱论坛
  • 营销型网站建设哪家好/微信搜一搜怎么做推广
  • 深圳网站建设专家/在线优化工具
  • 莆田外贸网站建设/营销型网站的类型
  • 百度做网站免费/免费涨热度软件
  • 做珠宝建个网站推广怎么样/关键词查询工具哪个好
  • 有什么手机做网站的/属性词 关键词 核心词
  • 独立网站做跨境电商可以行吗/详情页页面页面
  • 网站建设网页与数据库连接/近一周热点新闻
  • 使用redis做视频网站缓存/seo免费教程
  • 类似wordpress nodejs/windows优化大师的特点
  • 网站生成静态页面/杭州seo关键词优化公司
  • wordpress主题主页面/百度首页排名优化平台
  • 在搜狐快站上做网站怎么跳转/求职seo服务
  • 大模型对比评测:Qwen2.5 VS Gemini 2.0谁更能打?
  • 算法精讲:二分查找(二)—— 变形技巧
  • c++: 尾置返回类型(Trailing Return Type)
  • 婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
  • PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
  • 四、计算机组成原理——第6章:总线