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

金山专业做网站推广软文

金山专业做网站,推广软文,南通优普网站建设团队,专业的西安免费做网站好久没写过双缓存了,趁现在有空重新温习下。 我们经常听说双缓存,但是很少使用多缓存,起码大多数情况下是这样吧。为什么不需要多缓冲呢,今天分析下。并不是缓冲区越多越好,这个需要考虑具体的应用场景。我们抽象假设一…

好久没写过双缓存了,趁现在有空重新温习下。

我们经常听说双缓存,但是很少使用多缓存,起码大多数情况下是这样吧。为什么不需要多缓冲呢,今天分析下。并不是缓冲区越多越好,这个需要考虑具体的应用场景。我们抽象假设一下应用场景,为了简化场景,假设只有一个读线程和一个写线程,设读时间为rt,写时间为wt,有三种情况:

1、当 rt==wt时,也就是说,读时间等于写时间。这时候,开辟几个缓冲区好呢,应该是两个。看以下时间图(图画得水,看得懂就好)

重上面的图可以看出,从写1开始,写1完成后,读1开始同时写2,当读1完成时写2正好也完成,因此理论上,这重情况下使用双缓存就可以了。

 

2、当rt>wt时,即读快于写,也就是读的时间小于写的时间,那么这时候应该使用几个缓存呢?理论上应该不超过两个,看以下时间图

写的时间比读的长,写1开始,写1完成后,读1开始时同时开始写2。当读1完成时,写2还没写完,所以这时候,即使有再多的缓存也没用(这里不考虑多线程写),所以最多有两个缓存就够了。为了搞高性能,这里最好使用多线程写,当然了,要是多核cpu。

3、当rt<wt时,即写快于读,这时候理论上应该设置2到3个缓存区就够了。看图

这个就不解释了,因为前面有,都类似,读得慢,写的再快也没有多大意义(除了占空间)。

有考虑不到的情景,请多多指教,谢谢!上个代码:代码里对_read_list和_write_list进行上锁操作,只是为了同时满足那三种时间关系。若已确定了是哪两种模型,可以去掉锁采用更快的方法

char buffer1[1024];
char buffer2[1024];std::vector<char*> _buffer_list;
std::vector<int> _read_list; // 可读缓存下标集合
std::vector<int> _write_list;// 可写缓存下标集合
std::mutex       _mutex;     // 同步锁
std::atomic<bool> _stopflag(false); // 全局停工标志void thread_read(Event* _er,Event* _ew)
{while(!_stopflag){// 等待读if (_er->wait_for(std::chrono::milliseconds(2000))){while(true){// 检查可读缓存的下标集合int idx = -1;_mutex.lock();if (!_read_list.empty()){idx = *_read_list.begin();_read_list.erase(_read_list.begin());}_mutex.unlock();if (idx==-1){break;}// 进行写char* pbuffer = _buffer_list[idx];cout << pbuffer << endl;// 模拟读很慢//Sleep(500);// 加入可写,上锁_mutex.lock();_write_list.push_back(idx);_mutex.unlock();// 通知可写_ew->notify_all();}}// do other
    }
}void thread_write(Event* _er,Event* _ew)
{int global = 0;while(!_stopflag){// 等待写if (_ew->wait_for(std::chrono::milliseconds(2000))){while(true){// 检查可写缓存的下标集合int idx = -1;_mutex.lock();if (!_write_list.empty()){idx = *_write_list.begin();_write_list.erase(_write_list.begin());}_mutex.unlock();if (idx==-1)break;// 进行写char* pbuffer = _buffer_list[idx];memset(pbuffer,0,1024);sprintf(pbuffer,"this is threadid %i write %i buffer %i times",std::this_thread::get_id().hash(),idx,++global);// 加入可读_mutex.lock();_read_list.push_back(idx);_mutex.unlock();// 通知可读_er->notify_all();}}// do other
    }
}int main()
{_buffer_list.push_back(buffer1);_buffer_list.push_back(buffer2);Event event_read,event_write;std::list<std::thread> _list_thr;// 读线程_list_thr.push_back(std::thread(thread_read,&event_read,&event_write));// 写线程_list_thr.push_back(std::thread(thread_write,&event_read,&event_write));system("pause");// 开始时,全部缓存可写for (size_t i=0; i<_buffer_list.size(); ++i)_write_list.push_back(i);//通知写
    event_write.notify_once();system("pause");_stopflag = true;for (auto& thr : _list_thr)thr.join();return 0;
}

 

转载于:https://www.cnblogs.com/openlib/p/5361888.html

http://www.lbrq.cn/news/2786797.html

相关文章:

  • 网站建设实训心得及收获公司建官网要多少钱
  • 什么网站做企业邮箱服务网站友情链接出售
  • 农副产品销售网站开发小学生简短小新闻十条
  • 杭州网站建设网络公司seo搜索引擎优化人才
  • eclipse与jsp网站开发seo店铺描述
  • 国内虚拟助手网站成都关键词优化平台
  • 网站制作需要哪些东西外链交易平台
  • 做网站还是网页设计网络推广员工资多少钱
  • 做网站全自动cpa引流天津优化代理
  • 网站建设分金手指排名一软文营销方法有哪些
  • 网站在线压缩淘宝关键词排名是怎么做的
  • 外国人做的甲骨文网站网站快速优化排名官网
  • 连云港外贸网站建设关键词代做排名推广
  • 设计师用的素材网站优化设计答案
  • 武汉今天最新消息湖南seo博客seo交流
  • 网站通常用什么编程做搜索推广是什么意思
  • 最早的c2c网站seo课程培训
  • 一个成功的网站要具备哪些方面b2b有哪些电商平台
  • 公司设计网站多少钱企业排名优化公司
  • 网赌代理武汉seo推广优化公司
  • 京东网站设计分析站长seo
  • 网站建设路由器怎么设置北京优化seo
  • 阿里巴巴武汉网站建设关键字排名优化公司
  • 网站备案有什么用2021友情链接qq群
  • 做网站推广的工资有了域名怎么建网站
  • 海会主机做的网站都能干什么的网络优化基础知识
  • 电商网站排行榜软文一般发布在哪些平台
  • 网站制作培训机构网络营销推广方案策划书
  • 网站加支付功能排名点击软件怎样
  • 免备案的免费顶级域名网络关键词优化软件
  • 华为云服务器(ECS)新手入门:注册、购买与使用实操教程
  • 软考网工选择题节选-2
  • 服务器硬件电路设计之 SPI 问答(二):SPI 与 I2C 的特性博弈及多从机设计之道
  • Python 作用域 (scope) 与闭包 (closure)
  • 机器翻译论文阅读方法:顶会(ACL、EMNLP)论文解析技巧
  • flutter项目适配鸿蒙