
学习boost
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
使用boost库的序列化serialization实现数据保存和恢复
在实际应用里经常要保存一些状态,比如下载文件时,要下载一个1000多个文件的任务,但程序有可能需要关闭,那么关闭之后程序怎么样知道已经下载了多个文件呢?这时就可以使用序列化来保存状态,以便程序重启动时加载状态回来,如下面的例子:// TestBin.cpp: 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include原创 2018-01-15 16:22:09 · 1940 阅读 · 0 评论 -
boost库在工作(31)网络服务端之一
上面已经介绍了客户端,接着下来就要开发服务端的程序了,因为只有客户端没有服务端是成不了事的,提供不了网络服务的。像C++这种语言,越来越多的应用都是在网络服务器领域,比如像HTTP服务器、EMAIL服务器、即时通讯服务器和游戏服务器等等。由于服务器的硬件资源都是比较昂贵,要提高处理大量服务的数据量,使用C++是比较合适的,可以说最佳性价比了,使用像JAVA这样的语言性能比C++低,使用汇编又开发成原创 2013-06-30 20:41:58 · 4765 阅读 · 0 评论 -
boost库在工作(33)网络服务端之三
在这个例子里,表示服务器与一个客户端的沟通渠道,就是一个连接,封装为类CConnect。它是当服务器接收到一个客户端连接请求之后创建的,主要用来就是管理这个连接的生命周期,以及数据的接收和发送。从生命周期上来说,当一个连接创建时就旦生了,那什么时候死亡呢?在这个类的设计上是非常优秀,非常巧妙的,因为它不会为多生存一点时间而存在,也不会提前死掉而导致非法的内存访问。有这样的特性,主要是得益于它继承类原创 2013-07-14 13:06:23 · 3417 阅读 · 0 评论 -
boost库在工作(32)网络服务端之二
在这个例子里,服务器对象主要使用boost::asio::io_service对象,这个对象主要用来构造异步接收数据使用,接着定义boost::asio::ip::tcp::acceptor对象,这个对象主要用来接收所有连接进来到服务器的连接,也就是起到监听的作用。在服务器类的构造函数里主要调用接受对象的async_accept方法发起监听连接的作用,就是等着客户端连接过来,如果不发起连接,是收不原创 2013-07-07 23:01:26 · 3567 阅读 · 0 评论 -
boost库在工作(30)网络客户端之五
在前面已经学习到客户端同步连接服务器的处理过程,由于同步的关系,前面的代码理解起来是比较简单,也容易接受,但它有一个致命的缺陷,就是在连接过程、在等服务器回应数据时,CPU不能做别的事情,只能在那里等待。这种等待对于有界面的软件来说,是一种不能接受的表现方式。比如当用户点击连接服务器之后,就一直等在那里,什么也不能操作,就算想立即退出程序也不行,必须等服务器回应之后,或者超时连接之后,才可以操作。原创 2013-06-16 22:29:55 · 4943 阅读 · 0 评论 -
boost库在工作(29)网络客户端之四
当客户端连接到服务器之后,想要做什么事情呢?其实就跟一个人去看医生一样,先去挂一个号,然后再根据排队的号去看医生,然后再根据医生的处方进行治疗。因此,在客户端和服务器设计上,一般有一条重要的原则,就是作为客户端要主动发起数据给服务器,让服务器知道客户端是来做什么事情的。比如同一个服务器的端口上,可以提供很多种客户端连接,像HTTP这样的服务器,也就面临着很多不同浏览器连接上来,而服务器要区分不同的原创 2013-06-11 17:58:51 · 3372 阅读 · 0 评论 -
boost库在工作(28)网络客户端之三
从前面的例子可以知道,一个服务可能有多条路径达到,但在网络里只能一个端点对应一个端点的通讯,多个端点只是有备无患的作用,起不到别的作用。近来,发现有一个客户的问题比较奇怪,就是这个客户的网络是有备用网络配置,当安装我公司的路由器时,就会发生很多奇怪的问题,导致网络堵塞。后来深入跟踪,并且不地抓包分析之后,发现是生成树形网络的协议包一直转发,导致网络堵塞。面对这样的问题,只能使用同一个服务器使用多网原创 2013-06-10 22:10:11 · 3289 阅读 · 2 评论 -
boost库在工作(27)网络客户端之二
由于一台服务器上可能存在多个服务,而每个服务使用了不同的端口,因而对一台服务器的查询,就可能返回多个服务的端口。为了表示多个服务,需要使用一个列表来表达多个服务存在。而访问一个列表,通常使用迭代设计模式来访问整个列表。因此就会使用下面的代码来进行域名解释:// boost_020.cpp : Defines the entry point for the console application.原创 2013-06-02 19:55:56 · 3711 阅读 · 3 评论 -
boost库在工作(26)网络客户端之一
说到网络,就立即回想到1997年那时,上网只是为了收发一下EMAIL,没有别的事情可做,并且大多数还是连接成局部网的情况。在局部网时,在一个计算机房里,最多只有10多台电脑联机,这样的局部网只能干一件事情,就是玩多人网络游戏,这个多人只支持4个人一起玩。随着时间推进,到1999年时就可以上网看新闻和使用QQ了,这时网络主要用来聊天,玩游戏的机会不多,做别的事情也不行,因为网络的速度很慢。到了200原创 2013-05-29 21:39:04 · 3736 阅读 · 0 评论 -
boost库在工作(25)任务之五
在前面的例子里使用了一个精度只能到秒级别的定时器,对于一般应用来说,已经卓卓有余,能对付大多数的情况了。但有一天,老板让你开发一个对时间精度能到毫秒级别的定时器,就显得力不从心,左思右想不得其解。假如在嵌入式系统里,往往可以直接操作定时器来实现,但在PC系统里,就不能直接操作硬件了,更何况操作系统还存在进程调度的中断,因此定时器的精度就大大打折扣。在boost库里提供了boost::asio::h原创 2013-05-25 23:34:58 · 5691 阅读 · 2 评论 -
boost库在工作(34)网络服务端之四
现在来仔细地分析类CConnect,它主要作用就是管理一个连接的事务,比如数据接收和发送。因此类CConnect一定要有一个网络socket成员,它就是使用boost::asio::ip::tcp::socket类,这个类主要实现异步或同步的方式接收数据网络数据。在这个例子里,调用boost::asio::ip::tcp::socket类的async_read_some函数来进行异步读取数据,所谓原创 2013-07-20 19:54:41 · 4014 阅读 · 0 评论 -
boost库在工作(35)网络服务端之五
在前面的例子里,只是处理每个连接发来的消息,然后再把消息转回自己的那里,跟别的连接没有什么关联,这种情况只会适应一种像HTTP的那样,只关心自己的东西。但在网络服务器里,最多的是跟别人有关联的服务。比如说聊天室,就是不断地把所有进入这个聊天室的人的消息向所有人广播出去,也就是每个进来的连接,把连接所有收到的内容,再向所有连接发送出去。又如在网络游戏的服务器里,当每个地图里走动的人,都要向所有可视范原创 2013-07-28 21:07:33 · 3057 阅读 · 0 评论 -
boost库在工作(36)网络服务端之六
在上面介绍了管理所有连接的类,这个类主要就是添加新的连接,或者删除不需要的连接。但是管理的类CAllConnect是没有办法知道什么时候添加,什么时候删除的,它需要从接收到连接类里获取得到新的连接,从连接类里获得删除的事件。如下面的代码://封装一个服务端类来处理网络。//软件开发人员: 蔡军生 2013-07-28//class CConnect : public boost::en原创 2013-08-04 16:37:59 · 3803 阅读 · 0 评论 -
boost库做什么用呢?
1、C++标准库不是已经很全面了吗?Boost又不是界面库,它主要解决些什么问题呢?哪类问题?2、Boost的开发人员都是C++标准委员会的吧,为什么没把它列做标准库,有什么不完善的问题吗?3、Boost应用前景如何,现在开发用的多吗?Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。 分类 ▪ 字符串和文本处理库 ▪ 容器库原创 2017-06-12 16:18:50 · 10742 阅读 · 1 评论 -
在XP系统上出现无法定位程序输入点 K32GetProcessMemoryInfo
在XP系统上出现无法定位程序输入点 K32GetProcessMemoryInfoVC2012升级补丁5.0之后,编译出来的程序发现在XP系统无法定位程序输入点 K32GetProcessMemoryInfo于动态链接库kernel32.dll之上。之前程序一直在XP上安装正常,今天测试组的同事突然发现,新发布的版本不能在XP上使用,这个问题比较奇怪,因为以往的版本都是没有问题的。为什么会突然出现原创 2015-09-23 10:11:55 · 17019 阅读 · 0 评论 -
Installshield limited edition for VS2012安装,不能注册问题
Installshield limited edition for VS2012安装,不能注册问题上周有个同事电脑坏了,需要重新安装一台电脑,因为一些旧的工程需要使用Installshield来打包,就安排这个同事去网上下载一个版本,并安装,结果还需要注册码。那就在Installshield网站上注册一个,结果发现连接在网站里打开了,但注册信息下拉框是空白的,怎么样也注册不成功。因为同事也没有去度原创 2015-08-14 15:32:43 · 10418 阅读 · 0 评论 -
boost 1.57在VC2012里编译出错以及解决
最新发布的boost版本是在2014年11月3日发布,由于项目里使用,就立即更新为最新版本的库,这样也可以让可能出现的BUG减到最少。不过在更新这库之后,发现原来可以编译通过的项目,而现在不能通过了,提示错误如下:transform_width.hpp(156): error C2589: '(' : illegal token on right side of '::'通过仔细地查看transf原创 2014-11-17 12:36:54 · 4025 阅读 · 0 评论 -
在安装VC2012上再安装VC2010时连接出错解决
提示如下出错:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid解决 方法:Go to C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exeand check the version of cvtres.exe:W原创 2013-11-29 09:21:17 · 4832 阅读 · 2 评论 -
boost库在工作(40)串行通讯
现代的计算机技术进步很快,各种的通讯也日新月异,像USB、网络、蓝牙、WIFI等通讯技术飞速地出现,改变了整个计算机的通讯能力,速度已经达到GBit级别。但是有一种最原始的通讯方式,还是保留了30年,它就是串行接口通讯。前一些年,有很多计算机已经准备把这个接口去掉,全部换USB了,近年来又看到串口恢复过来,重新成为基本计算机配置。那为什么呢?其实串口具体一个大特点,就是简单,它简单到不需要什么驱动原创 2013-09-15 11:29:46 · 3906 阅读 · 0 评论 -
boost库在工作(39)网络UDP异步服务端之九
前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的。如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以选择,就是创建一个异步的UDP服务器或客户端,这样既有单线程的简单性,也可以让客户随便操作界面的快速响应的特性。在boost库里使用io_service对象来实现异步是轻而易举的事情,因为封装的接口简原创 2013-09-01 09:25:55 · 8452 阅读 · 1 评论 -
boost库在工作(38)网络UDP客户端之八
前面创建了一个UDP服务器,主要是提供时间查询,因为它是一个服务器,所以没有能力连接服务器的,因此需要创建一个客户端来,后面主要就是做这件事情。在说明怎么样编写UDP客户端之前,在这里回复一个网友的问题,他说TCP基本上已经可以无错地做任何事情,包括我前面说的视频通讯,因而使用UDP是不必要学习的。在这点上,UDP还是有不可替换的领域,比如要开发局部网的广播,在TCP里是一对一的连接,它是干不了这原创 2013-08-24 19:31:12 · 4715 阅读 · 0 评论 -
boost库在工作(37)网络UDP服务端之七
前面介绍的都是网络TCP的服务器和客户端,其实还有UDP的服务器和客户端,同时也有同步和异步之分。UDP与TCP最大的区别,就是TCP是基于连接的,而UDP是无连接的。这里所谓的连接是指对方中断服务时,另外一方是可以感知的,而UDP是无法感知对方是否中断服务。还有另外一点,TCP发送的数据包是有流量控制和顺序控制的,而UDP是无流量控制和顺序控制的。因而采用UDP时,基本上都是发送一些无关顺序,或原创 2013-08-11 20:43:51 · 5052 阅读 · 0 评论 -
boost库在工作(23)任务之三
在前面的多任务执行里,因为有多个线程执行,只要放到任务队列里的任务都会执行,但这些任务执行顺序是随机的,没有固定的顺序,也就是说放入队列早的任务不一定就是早执行,放入队列迟的任务也不一定后执行。这样没有顺序的执行性是多线程的本来特性,虽然可以使用锁对象来同步一个对象不被多个线程同时访问,但它是没有办法确保任务之间的有序访问同一个资源。这时,就需要引入一个对象io_service::strand,有原创 2013-05-12 15:46:51 · 6412 阅读 · 9 评论 -
boost库在工作(24)任务之四
在软件开发里,经常会遇到这样的情况,比如客户让我们开发的软件要求每隔半小时,就要备份一次数据,以便避免数据丢失。又比如在开发一个游戏网络服务器时,需要不断检查客户端连接上来的数据连接是否还有效,这时也需要使用一个任务来检查客户端的连接是否还有心跳包过来,如果没有心跳包,就可以把这个连接断开,释放相关的资源,避免服务器的资源永远占用,导致服务器运行时间长了就会死机。面对这些情况,在有界面的情况下,往原创 2013-05-18 23:40:59 · 3719 阅读 · 0 评论 -
boost库在工作(22)任务之二
往往我们开发出来的产品,都是运行在不同的国家,不同的地区,不同生活水平的用户,因而软件产品会运行在不同的环境的电脑里。比如富裕国家里的电脑硬件资源,都比较好,如果还是按低配置电脑的水平设计,显示不会满足用户的要求。但是按高配置要求的硬件资源来设计,行吗?也不行,比如软件安装到工厂这样节约资源的电脑硬件资源里,就会运行不起来,或者说不流畅。因此,在设计软件产品时,需要动态适应电脑运行环境,或者根据电原创 2013-04-29 11:11:45 · 3178 阅读 · 1 评论 -
boost库在工作(12)引用计数的智能指针intrusive_ptr
当我们在维护旧代码时,很多情况是身不由己的,想从头来开发,又需要时间过多,投入成本过多,老板当然不愿意。想继续使用旧的代码,又需要投入过多的维护成本。要想在这种情况下,提高代码的维护性,又减少出错,因而想引入智能指针管理。比如已经存在引用计数的对象时,如果再想使用智能指针shared_ptr来管理,显然达不目标了,那么怎么办呢?就这样放弃智能指针的使用吗?显然不行,有没有更好的方法呢?在boost原创 2013-03-03 18:53:25 · 4837 阅读 · 0 评论 -
boost库在工作(8)引用计数的智能指针shared_ptr之一
在前面已经介绍了三个智能指针,它们都是适合在局部作用域,不进行拷贝的情况下使用,最为合适,如果使用到其它情况,使用的好处跟坏处一样多,这种情况就不宜使用了。在目前多核处理器流行的今天,并发处理已经成为常事,因为多线程运行的高效性,界面操作人性化方面,都需要并发性处理。比如界面需要一直响应用户的操作,但后台的任务又需要有序地进行,只能阻塞在那里。这时,如果使用单线程,就显然人机操作界面不好了。在采用原创 2013-02-17 13:06:36 · 3461 阅读 · 0 评论 -
boost库在工作(7)使用数组智能指针scoped_array
学习过C++的开发人员,都知道在C++里数组指针与一般的指针是有区别的。比如使用数组形式分配的内存,就需要使用数组的形式删除。但初学开发的开发人员,往往会忘记这点,在我过去10多年的软件代码审查过程里,经常发现这点,如下面所示:char* pBuf = new char[256];......这里使用delete pBuf; 在最后这行代码上,就使用出错了。应该使用数组的形式删除,否则只删除了原创 2013-02-07 21:31:11 · 4316 阅读 · 2 评论 -
boost库在工作(6)作用域智能指针scoped_ptr之五
通过前面智能指针的学习,应了解到std::auto_ptr的使用和局限性,从而引发boost库针对这些情况提供了更多的智能指针,其中scoped_ptr就是针对std::auto_ptr的而提供的。对开发人员来说,代码限制得越精确,编译器发现尽可能多的错误,就是越好的方式。比如想要某个变量不能改变它的值,就需要常量限定符,这样就可以杜绝任何不小心对变量的操作。在普通的指针里,也常常使用const来原创 2013-02-05 20:58:58 · 2591 阅读 · 0 评论 -
boost库在工作(5)作用域智能指针scoped_ptr之四
第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子://异常抛出的函数,适合使用智能指针。//软件开发人员: 蔡军生 2013-02-03void ThrowFun(void){ if (1) { throw "Test Throw!"; } }void TestCallThrow(void){ std::auto_ptr nVal(new int);原创 2013-02-04 21:58:21 · 2513 阅读 · 1 评论 -
“坑爹的LIST容器--删除操作千倍消耗CPU”一文有误,在VC2010里是STL完胜
下面是STL的测试情况:every 3 seconds add/del element number is 40000stl list has 40000 elementsadd cost time too much: 109stl list has 0 elementsdelete cost time too much: 4992*********************************原创 2013-02-05 22:00:58 · 2902 阅读 · 5 评论 -
boost库在工作(4)作用域智能指针scoped_ptr之三
标准模板库里的智能指针std::auto_ptr,一般情况下,只适合在函数中使用,当离开这个函数时,就可以自动删除分配的资源。典型的情况有两种,一种是当一个函数代码比较多,判断条件很多,这样出口很多。另一种就是带有异常机制的代码,因为异常没有抛出来之前,没有办法确定那行代码会突然间就退出来,这种情况下对资源管理,会给软件开发人员带来很大的压力,即使很有经验的开发人员,也有点防不防的,会花大量的时间原创 2013-02-03 11:11:52 · 2442 阅读 · 0 评论 -
boost库在工作(3)作用域智能指针scoped_ptr之二
智能指针的原理,其实就是利用C++的一个特性,当对象创建时,一定会调用构造函数;当对象离开作用域时,会自动调用析构函数。由于这两个函数的调用都是由编译器来生成的,不用怕不调用的危险,达到安全删除的目的。当然,智能指针使用了一个对象的构造和析构,显示增加了一些开销,但比起垃圾回收机制来说,是非常小的,基本可以忽略不计。 既然智能指针已经有这么多优点,迫不及待了吧,怎么样使用呢?下面就先来看看std:原创 2013-02-02 23:42:16 · 2680 阅读 · 2 评论 -
boost库在工作(2)作用域智能指针scoped_ptr之一
很久远以前,丹尼斯.里奇发明了C语言,这个语言有一个优点,就是可以动态地分配内存。当需要使用内存时,就可以立即向系统申请。当不需要时,又可以立即释放回给系统,再给别的程序使用。这种动态的内存管理,使得当时以K计算的内存时代,也可以处理很大数据量的软件出现。但这中使用函数malloc来分配内存,使用函数free来释放内存的机制,一直到今天,还在使用。不过,这种方式有一个缺点,就是当你不断地使用函数m原创 2013-02-01 23:37:55 · 2912 阅读 · 0 评论 -
boost库在工作(9)引用计数的智能指针shared_ptr之二
接着下来,需要演示一下怎么样在多个对象里共享一个对象,而不管每个对象的生命周期,就可以及时地把使用的对象在合适地方删除。下面的例子里先定义两个类,然后每个类都引用共享的对象,接着使用完成后,就会在析构函数里删除,可以从例子程序运行的输出结果看到内部运行的生命周期。有了共享智能指针,面对多个对象共享使用一个对象,这样的管理会方便很多。具体代码如下://在两个对象之间共享使用shared_ptr//原创 2013-02-19 20:34:23 · 3846 阅读 · 0 评论 -
boost库在工作(10)引用计数的智能指针shared_array
在共享指针里,有时也需要共享一个缓冲区,比如从网络收到数据,需要先放到缓冲区里,接着把这些数据发送给处理线程进行解包和处理。在这里就需要使用到两个线程里共享缓冲区的问题,因此比较好的解决方案,就采用引用计数的智能指针shared_array来解决,最为合适不过了。shared_array与shared_ptr具有相同的形式,使用和注意点也是相似的。具体的使用的例子如下:// boost_005.c原创 2013-02-22 21:52:56 · 3367 阅读 · 0 评论 -
boost库在工作(11)引用计数的智能指针weak_ptr
由于boost库里的shared_ptr采用引用计数的技术,这个技术天生就存在一个缺陷,就是不能存在循环引用的情况,因为这个缺点,引用计数的技术一直没有用到垃圾回收的算法里。既然存在这方面的问题,作为C++强大的boost库,一定会想办法解决的。因此,就提出另外一个智能指针weak_ptr。这个智能指针只对引用的指针进行保存,但不增加引用指针的计数,因而它不对shared_ptr的指针具有拥有权,原创 2013-02-24 21:35:53 · 3614 阅读 · 0 评论 -
boost库在工作(20)线程之五
通过上面的学习,基本上就可以使用线程了,但怎么样让线程运行类里的成员函数呢?以便封装得更方便使用了。接着下来,就看这个例子,如下:// boost_013.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include //封装线程组运原创 2013-04-21 19:52:19 · 2906 阅读 · 2 评论 -
boost库在工作(21)任务之一
在软件开发里,常常遇到多个任务同时添加的情况,比如用户要下载一部电视连续剧,就会一起添加几十集,让它一集一集地下载。如果这时使用线程池来运行,就需要这个任务队列可以多个线程同时访问它,如果队列里没有任务时,可以让多个线程等着,只要有任务到达,就立即运行。在boost库里提供了一个强大的任务队列,这个队列可以使用线程池访问,也可以当任务为空时阻塞线程。使用这个任务队列,可以让多个任务动态运行,以及适原创 2013-04-28 22:35:49 · 3572 阅读 · 0 评论 -
boost库在工作(19)线程之四
从前面也看到使用锁boost::mutex时,如果不小心就会死锁,这样要费心费力去维护这样的代码,在boost库里提供同一个函数递归调用时使用的锁boost::recursive_mutex,当同一个线程调用时,碰到相同已经上锁的锁时,还可以继续往下执行。这时就不用担心同一个线程调用不同的函数时造成死锁了。在前面的例子死锁的代码,当换成这个锁之后,就不会再有死锁了,代码如下:// boost_01原创 2013-04-13 19:05:44 · 3150 阅读 · 0 评论