Linux后台服务器编程。
发布时间:2014-11-03 22:00:56
使用io_service作为处理工作的work pool,可以看到,就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行,有可能你会发现,io_services.dispatch的接口也和io_service.post一样,但不同的是它是直接调用而不是经过push到队列然后在io_services.run中执行,而在这个示例.........【阅读全文】
发布时间:2014-11-11 22:16:05
l 下面我们就详细的分析一下BOOST::ASIO。首先我们从宏观使用的角度来考察ASIO。作为开始首先从同步IO方式开始我们的剖析之旅。1: BOOST ASIO 下的同步IO操作。由于asio库具有在不同平台,不同编译器下工作的特性。其对不同平台和编译器的适应是其一大特色且其具有类似于ACE跨平台的特性,相比起ACE的复.........【阅读全文】
发布时间:2014-11-11 22:03:23
1: 我预先需要知道哪些知识? 1)socket 通讯的基本知识:如tcp/ip基本原理,socket编程的基本知识,blocking/noblocking。 2) 关于select/poll/epoll模型的相关基础知识,知道其基本工作原理。 3) IOCP(IO Completion Port)完成端口的基本知识,见附录2。.........【阅读全文】
发布时间:2014-11-11 21:33:53
前几天写了篇日志<<关于boost.asio的一点备忘>>,主要是基于其在linux平台下的实现写的,今天还是一篇备忘,根据boost.asio在win与非win下的实现来谈谈它的跨平台设计与实现.boost.asio根据系统平台提供的事件多路分发机制来实现proactor模式,实现的差异化主要体现在支持IOCP机制与支持其它分发机制,下面就基于boost.asi.........【阅读全文】
发布时间:2014-11-11 21:25:42
这两天事情不多,简单看了下boost.asio的源码,因为asio采用proactor模式,而windows下的IOCP本身就是这个模式的体现,所以将精力集中在了asio在linux下的实现(asio在windows下采用了IOCP,linux下用epoll,还有其它的一些实现如kqueue,select等).在高性能服务器并发模型设计中,Reactor和Proactor是两个经常用到的设计模式,.........【阅读全文】
发布时间:2014-11-11 21:08:56
Boost asio 实现基于epoll,但是epoll只支持reactor模式,ASIO通过封装在epoll上实现了proactor。......【阅读全文】
发布时间:2014-11-11 20:52:02
io_service的作用io_servie 实现了一个任务队列,这里的任务就是void(void)的函数。Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。Io_servie的接口提供的接口有run、run_one.........【阅读全文】
发布时间: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-04 13:27:36
这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。 boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应用程序的编写方式。 Scott Meye.........【阅读全文】
发布时间: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 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(部分库不支.........【阅读全文】
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};