Linux后台服务器编程。
发布时间:2014-11-09 17:44:16
1.dll的优点代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒.........【阅读全文】
发布时间:2014-11-06 10:00:48
简单的说:shared_lock是read lock。被锁后仍允许其他线程执行同样被shared_lock的代码。这是一般做读操作时的需要。unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。在写操作时,一般用这个,可以同时限制unique_lock的写和share_lock的读。例子:void Ge.........【阅读全文】
发布时间:2014-11-05 09:53:16
const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如:const int nValue; &.........【阅读全文】
发布时间:2014-11-04 22:30:06
C 风格(C-style)强制转型如下:(T) expression // cast expression to be of type T函数风格(Function-style)强制转型使用这样的语法:T(expression) // cast expression to be of type T这两种形式之间没有本质上.........【阅读全文】
发布时间:2014-11-04 16:52:21
很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。学过TCP/IP的同学应该都知道,传输层的两个主要协议是UDP和TCP,其中UDP是无连接的、面向packet的,而TCP协议是有连接、面向.........【阅读全文】
发布时间:2014-11-04 13:27:36
这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。 boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应用程序的编写方式。 Scott Meye.........【阅读全文】
发布时间:2014-11-04 13:23:42
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); // 用C风格的字符串p作为初始化值//…}String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello.........【阅读全文】
发布时间:2014-11-04 10:52:26
deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。1. 构造函数在构造deadline_timer时指定时间。[cpp] view plaincopyprint?.........【阅读全文】
发布时间:2014-11-03 21:43:30
1.boost::anyboost::any是一种通用的数据类型,可以将各种类型包装后统一放入容器内,最重要的它是类型安全的。有点象COM里面的variant。使用方法:any::type() 返回包装的类型any_cast可用于any到其他类型的转化#include <boost/any.hpp>void test_any.........【阅读全文】
发布时间:2014-11-03 20:56:46
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁。[cpp] view plaincopyprint?void test_asio_nowork() { boost::asio::io_service ios; .........【阅读全文】
发布时间:2014-11-03 14:03:37
io_service的作用io_servie 实现了一个任务队列,这里的任务就是void(void)的函数。Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。Io_servie的接口提供的接口有run、run_.........【阅读全文】
发布时间:2014-11-03 13:46:35
1: io_service 与 strand 的关系是什么?2: strand : /// Provides serialised handler execution. 能够保证线程安全,同时被post 或 dispatch 的方法 不会被并发的执行; 而 io_service 不能保证:&nbs.........【阅读全文】
发布时间:2014-11-03 11:21:37
1,字符串 到 数值类型的转换2,数值 到 字符串的转换 3,异常处理情况 4,boost::lexical_cast 的原型: template<typename Target, typename Source> Target lexical_cast(Source arg); lexical_cast 是依赖于字符串流 std::stringstream 的,其原理也是相当的简.........【阅读全文】
发布时间:2014-11-02 16:38:28
boost中使用线程和mutex的示例:点击(此处)折叠或打开#include <boost/thread/mutex.hpp>#include <boost/thread/thread.hpp>#include <iostream>boost::mutex io_mutex; // The iostreams are not guaranteed to be thread-.........【阅读全文】
发布时间:2014-11-02 10:09:50
之前一直看的unix网络编程,使用linux系统调用来创建服务器。而在boost中也同样可以创建服务器,boost对底层的系统调用进行了封装,使用的时候更加面向对象。只需要向相应的对象传递一定的参数即可创建连接:使用的主要的对象如下:client方面:由main出发分别是:boost::asio::ip::tcp::resolver::query m_query("www..........【阅读全文】
发布时间:2014-10-31 10:40:04
C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库。容器往往包含同一类型的数据。STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等。.一. vector1.声明: 一个vector类似于一个动态的一维数组。 &nbs.........【阅读全文】
发布时间:2014-10-31 09:37:24
最近在做一个消息中间件里面涉及到多线程编程,由于跨平台的原因我采用了boost线程库。在创建线程时遇到了几种线程创建方式现总结如下: 首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象; (2)explicit thread(c.........【阅读全文】
发布时间:2014-10-30 15:29:10
weak_ptr是为配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手,而不是智能指针,因为它不具有普通指针的行为,没有重载operator*和operator->,它的最大作用在于协助shared_ptr,像旁观者那样观测资源的使用情况。 类摘要:[cpp] view plaincopyt.........【阅读全文】
发布时间:2014-10-30 14:59:33
shared_from_this()在一个类中需要传递类对象本身shared_ptr的地方使用shared_from_this函数来获得指向自身的shared_ptr,它是enable_shared_from_this的成员函数,返回shared_ptr。首先需要注意的是:这个函数仅在shared_ptr的构造函数被调用之后才能使用。原因是enable_shared_from_this::weak_ptr并不在enable.........【阅读全文】
发布时间:2014-10-30 09:09:12
——更新于2011/7/19,目前我已对boost的安装和使用有了新的认识,因此也会对两年前写的这篇文章做大幅修改,网上转载版本泛滥,请以本文为准。——更新于2013/3/20,增加ARM Linux下的编译配置方法。 理论上,本文适用于boost的各个版本,尤其是最新版本1.48.0;适用于各种C++编译器,如VC6.0(部分库不支.........【阅读全文】
发布时间:2014-10-29 21:53:45
Tortoise SVN使用方法,简易图解 刚到公司实习,为了版本控制,我公司使用SVN控制版本,在此记下SVN使用方法,仅供参考! 废话少说,上图!-------------------------------------------------------我是分割线-------------------.........【阅读全文】
发布时间:2014-10-29 20:32:07
在类中,有两个与众不同的成员函数,那就是构造函数和析构函数。当构造函数与析构函数遭遇继承和多态,它们的运行状况又会出现什么变化呢?多态性是在父类或各子类中执行最合适成员函数。一般来说,只会选择父类或子类中的某一个成员函数来执行。这可给析构函数带来了麻烦!如果有的资源是父类的构造函数申请的,有的资源.........【阅读全文】
发布时间:2014-10-25 16:23:02
服务器的创建分为两个步骤:1、建立socket;2、创建线程。两点内容的细节:1、建立socket方面:socket()bind()listen()accept()read()write()close()//关闭套接字时候在线程中关闭,而且只需关闭一次,在父进程中无须关闭socket,这一点不同于fork创建的进程。相关的套接字API如上所示。2、创建线程方面.........【阅读全文】
发布时间:2014-10-24 21:44:58
之前都是参考别人的代码,现如今自己动手来写一个个人版本的线程池,线程池的实现本身并不复杂,无非就是创建一些线程然后让这些线程处于条件等待状态(可以用条件变量,也可以用信号量来实现)。这是最基本的原理,原理的理解很简单,但重要的是实现的细节问题。线程池的实现:包含内容:1、线程数量N;2、线程的工.........【阅读全文】
发布时间:2014-10-24 21:09:38
一、创建分离线程有两种方式创建分离线程:(1)在线程创建时将其属性设为分离状态(detached);(2)在线程创建后将其属性设为分离的(detached)。二、分离线程的作用由系统来回收线程所占用资源。三、实例#include <stdlib.h> #include <string.h> #include <unistd.h> #include <sema.........【阅读全文】
tianyashuibin2014-12-08 11:22
Oscarzhao:c++11 中貌似可以
嗯,是的,在c++11中可以
下面是在gcc的编译结果:
test_struct.cc:8:11: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
int a = 1;
^
tianyashuibin2014-10-23 21:57
除了静态数据成员外,数据成员不能在类体内显式的初始化
举个最简单例子
struct a
{
int a=1;
int b=2;
};
这也不能通过啊!
原因很简单,因为struct a此时只是在说明有这么个类型,而并没有定义一个具体的变量和分配内存空间
tianyashuibin2014-10-23 21:39
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
1.类里面的任何成员变量在定义时是不能初始化的。
2.一般的数据成员可以在构造函数中初始化。
3.const数据成员必须在构造函数的初始化列表中初始化。
4.static要在类的定义外面初始化。
5.数组成员是不能在初始化列表里初始化的。
6.不能给数组指定明显的初始化。
这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。
tianyashuibin2014-10-23 21:32
记住静态成员这样初始化:
C/C++ code
class A
{
public:
static const int a[3];
};
const int A::a[3] = {1,2,3};