浮萍晓生的开发日志

记录学习的旅程,把握可预见的未来

导航

文章分类 -  C++ STL/Boost

摘要:Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型.综述基本原理应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完成独立的IO操作需要很长时间.对应用程序开发者提出了一个挑战.Boost.Asio提供了管理需长时间运行操作的工具,但不必涉及到线程的并发模式和显示锁定.Boost.Asio库使用C++来实现,提供如网络编程等常用的操作系统接口. Boost.Asio实现了如下目标:·可移植性Portability.库支持一系列的常用系统操作,具有稳定的跨平台特性.·可扩展性Scalabili 阅读全文

posted @ 2014-02-21 16:13 浮萍晓生 阅读(190) 评论(0) 推荐(0)

摘要:BOOST::ASIO为我们提供了两种I/O机制,分别是同步和异步。它可在多平台上移植,在不同系统上采用了不同的实现。ASIO为我们封装了一系列的socket api,同时为我们提供了一套相当完善的服务器编程体系,部分概念(关键词)如:io队列、基于回调的异步通知、定时器、自定义的多线程机制。假设大家已经安装好了boost,并有一些C++基础,针对TCP服务器编程,我们有如下需求:1.一个可用于接受新连接的类2.提供基本的send/recv io操作3.解决多线程下的资源竞争问题4.管理连接的生命周期5.为不同的网络事件提供回调方法针对以上需求,先来设计一个简单的框架。我们分为TCPServe 阅读全文

posted @ 2014-02-20 13:02 浮萍晓生 阅读(595) 评论(0) 推荐(0)

摘要:1.连续内存序列容器(vector,string,deque)序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素。vector c;for(vector::iterator it = c.begin(); it != c.end();){ if(need_delete()) it = c.erase(it); else ++it;}2.关联容器(set,multiset,map,multimap)关联容器的erase方法没有返回值,被删除的迭代器失效,所以删除前必须确保能得到下一个迭代器,可以用“后置递增迭代器”技术。... 阅读全文

posted @ 2014-02-13 11:36 浮萍晓生 阅读(180) 评论(0) 推荐(0)

摘要:C++ 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到STL中了,本文就简单的介绍一下。引用包装器(Reference Wrapper)当模板函数参数为泛型类型的时候,无法推导出是传值还是传引用,默认情况下会使用传值的方式。这是我们可以用std::ref显式指定以传引用的方式实例化模板函数。#include#includetemplatevoidfoo(Targ){arg++; }intmain(){intcount = 3;foo(count);//此时传的是值,模板实例化为foo(int),count值不变std::cout #includeusingnamesp. 阅读全文

posted @ 2014-01-08 17:16 浮萍晓生 阅读(238) 评论(0) 推荐(0)

摘要:C++11的标准已经确定,除了增加了不少库函数外,在语法方便也得到了许多增强。其中如下几个语法就是我比较喜欢的:自动类型推导auto现在c++终于在编译器级别支持类似C#的var关键字了,在c++里的关键字是auto,基本用法如下:autoi = 0;//intautoc ='c';//charautos ="hello world";//const char*auto关键字的一个很直观的好处是我们可以简化stl容器遍历里的那个iterator了:for(autoit = v.begin(); it != v.end(); it++){cout vArray 阅读全文

posted @ 2014-01-08 16:44 浮萍晓生 阅读(330) 评论(0) 推荐(0)

摘要:很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等。由于这部分数据记录在内存中,因此并不能无限递增,一般有容量限制,超过后就将最开始的数据移除掉。在stl中并没有这样的数据结构,一般需要我们自己构造,常用方法如下:用list构造,超过后把数据头移除用vector构造,超过后把数据头移除用数组构造,通过循环的方式覆盖这几种方式都有各自的缺点:用list构造无法实现随机访问,用vector构造移动数据头开销较大,用数组构造需要维护数据头指针和防止计数器溢出,计算位置和数据的移除也相对较麻烦。当然,这些都不是无法解决的问题,就是稍微麻烦点。不过现在boost直接提供了一个circular 阅读全文

posted @ 2014-01-08 16:27 浮萍晓生 阅读(135) 评论(0) 推荐(0)

摘要:创建buffer在io操作中,对数据的读写大都是在一个缓冲区上进行的,在asio框架中,可以通过asio::buffer函数创建一个缓冲区来提供数据的读写。buffer函数本身并不申请内存,只是提供了一个对现有内存的封装。chard1[128];size_tbytes_transferred = sock.receive(asio::buffer(d1));直接用字符串做buffer也是常见的形式:stringstr =" hello world ";size_tbytes_transferred = sock.send(asio::buffer(str));除了这些基础类 阅读全文

posted @ 2014-01-08 11:10 浮萍晓生 阅读(190) 评论(0) 推荐(0)

摘要:asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程。客户端客户端的代码如下: #include #include #include using boost::asio::ip::tcp; int main(int argc, char* argv[]) { try { boost::asio::io_service io_service; tcp::endpoint end_point(... 阅读全文

posted @ 2014-01-08 11:05 浮萍晓生 阅读(175) 评论(0) 推荐(0)

摘要:IO模型io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。asio::io_serviceio_service;asio::ip::tcp::socketsocket(io_service);在asio框架中,同步的io主要流程如下:应用程序调用IO对象成员函数执行IO操作IO对象向io_service 提出请求.io_service 调用操作系统的功能执行连接操作.操作系统向io_service 返回执行结果.io_service将错误的操作结果翻译为boost::system::error 阅读全文

posted @ 2014-01-08 10:58 浮萍晓生 阅读(131) 评论(0) 推荐(0)

摘要:同步Timerasio中提供的timer名为deadline_timer,它提供了超时计时的功能。首先以一个最简单的同步Timer为例来演示如何使用它。 #include #include int main() { boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3)); timer.wait(); std::cout timer_callback ; voi... 阅读全文

posted @ 2014-01-08 10:33 浮萍晓生 阅读(234) 评论(0) 推荐(0)

摘要:要开始使用 Boost.Function, 就要包含头文件"boost/function.hpp", 或者某个带数字的版本,从"boost/function/function0.hpp"到"boost/function/function10.hpp". 如果你知道你想保存在function中的函数的参数数量,这样做可以让编译器仅包含需要的头文件。如果包含"boost/function.hpp", 那么就会把其它的头文件也包含进去。 理解被存函数的最佳方法是把它想象为一个普通的函数对象,该函数对象用于封装另一个函数( 阅读全文

posted @ 2014-01-06 15:37 浮萍晓生 阅读(307) 评论(0) 推荐(0)

摘要:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即:• 一个 shared_ptr 对象实体可被多个线程同时读取(文档例1);• 两个 shared_ptr 对象实体可以被两个线程同时写入(例2),“析构”算写操作;•如果要从多个线程读写同一个 阅读全文

posted @ 2014-01-06 11:01 浮萍晓生 阅读(144) 评论(0) 推荐(0)

摘要:这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应用程序的编写方式。Scott Meyers的Effective C++ 3rd ed.第35条款提到了以boost::function和boost:bind取代虚函数的做法,这里谈谈我自己使用的感受。基本用途boost::function就像C#里的delegate,可以指 阅读全文

posted @ 2014-01-06 10:11 浮萍晓生 阅读(137) 评论(0) 推荐(0)

摘要:boost::format类提供了类似C语言里'printf'功能的格式化输出能力,当然功能更强大。所需头文件:#include 示例代码:#include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv[]){ // 使用%序号%的方式给出指示符, 后面用%连接对应的数据。 cout << boost::format("writing %1%, x=%2% : %3%-th try") % "toto" % 40.23 % 50 阅读全文

posted @ 2013-12-16 15:13 浮萍晓生 阅读(407) 评论(0) 推荐(0)