自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 GCC O2编译的bug

最近对以前写的tcp网络库做吞吐量测试,gcc O1编译,运行效果很好,可以达到900MiB/s。但是问题来了,当我用gcc O2选项编译网络库,程序一启动就core掉。查看coredump文件,原因大概如下:挂在g_pool.DoSomething();但是在DoSomething()里, this != &g_pool;非常诡异。我对自己的程序还是很有信心,不会

2013-01-24 19:02:31 3023

原创 redis网络事件的特殊处理——stale event

在ae.c文件的aeProcessEvents函数中,针对返回的网络事件有这样的处理代码:int rfired = 0; /* note the fe->mask & mask & ... code: maybe an already processed * event removed an element that fired and we still didn't

2013-01-12 15:18:37 1123

原创 android线程通信利器——handler

Handler是android提供的一个线程之间通信的接口。最开始没注意它,因为只是主线程也就是UI线程使用了handler,而主线程是默认有消息循环的,对开发应用程序是透明的。所以我还误以为handler像是linux信号那样的废材不堪用。linux信号处理程序很受限,推荐做法基本都是在处理程序中设置一个标志,其它循环中处理这标志。甚至在处理程序中使用printf是可能造成单线程

2013-01-02 18:03:40 675

翻译 redis replication

ReplicationRedis replication is a very simple to use and configure master-slave replication that allows slave Redis servers to be exact copies of master servers. The following are some very importan

2012-12-26 19:15:47 810

原创 boost enable_if——SFINAE(匹配失败不是错误)

让我们看下这段程序:很简单的一个重载;如我所愿,程序正常运行结果如下:void func(int)void func(T) [with T = Test]现在,取消最后一行的注释,再次编译。。。出现了如下编译错误:test0.cc: In function ‘void func(T) [with T = short i

2012-09-20 14:07:23 2583

原创 计数智能指针要点(shared_ptr)

引言: 与java等众多支持GC的现代语言不同,C/C++将更多的内存控制权交给程序员,在保证效率的同时,也给了很多犯错的机会。常见的内存泄露、重复释放等等。智能指针大大减少了犯错的机会,简化代码,提高可维护性。常用的智能指针有scope_ptr(c++ 11 unique_ptr),利用RAII特性,保证资源在作用域失效的时候被释放,也保证异常抛出时栈回滚

2012-09-14 09:06:23 2515

原创 困扰我快一个月的BUG

昨天终于解决了...1.背景:提供音视频服务的业务随着用户量的上涨,UDP丢包逐渐加剧。其实包量也不大,高峰期每秒不超过10W的UDP包,不应该丢包的。而前辈们的网络底层代码是单线程的,因此决定将网络线程独立出来,以提高效率。2.多线程策略  学过操作系统的应该知道,生产者和消费者的例子。只需要知道1:1的例子即可,这种情形下,可以使用无锁环形缓冲区,避免了mutex的代价(尽管事实上mute

2012-08-18 17:04:45 1860

原创 android的多点触摸(附自己的部分代码)

[中文是转的]1、onInterceptTouchEvent()是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false

2012-06-27 11:07:53 938

原创 协程

我们经常遇到这样一种情况:服务器A收到客户端的请求:删除该用户的某文件;A需要向文件服务器转发请求,因此首先要把请求保存起来;在未来的某个时刻,文件服务器发来了响应;A再根据响应查找到保存的请求,处理,然后向客户端回复结果:删成功了,或是文件不存在,或是你没有权限等等。是不是有点复杂?(这里没考虑文件服务器超时,自己加timer去,不是这里的重点)。

2012-05-20 17:03:22 996

原创 boost::any实现

在用C++编写coroutine基础类的时候,需要参数的传递。而基础类对参数类型一无所知,毕竟参数是与应用相关的。此时,boost::any就派上用场了。编写此类的时候并没有参考boost::any代码(因此功能肯定不如boost::any完善严谨),写完后做了一下参考,将命名向boost看齐1.  先思考一下Any的用法:Any obj;obj = 5;

2012-05-20 15:47:40 1251

原创 函数调用约定

在C程序中,带参数的函数调用有几种方式;这里主要介绍三种:stdcall, cdecl, fastcall;    stdcall是WINDOWS API的默认方式;这种方式,参数由被调用者清除,因此产生的代码体略微小一点点(不明显,毕竟就那么几条汇编指令)。但该方式不能应付变长参数的函数,比如printf;因为printf本身不知道传进来多少个参数,参数大小,只能运行时解析获得;而对于v

2012-01-10 19:00:47 522

原创 不改动已存在代码,程序退出时检测内存泄露

(2012.05.19补充:尽管-rdynamic选项使得可读性大大提高,但仍然不太好根据二进制地址定位到某行泄露代码;这时使用objdump  -S  exefile 即可)在WINDOWS下检测内存泄露比较容易,毕竟MSDN强大,方法多多;有兴趣可以查看VLD源代码;  前几天无意中从MAN文档中查到linux可以给malloc挂钩子;于是写下了如下检测内存泄露的代码;

2011-12-07 10:52:42 1264

原创 MEMCACHED(5)——对哈希表的改进

1.在官网还是哪儿,我看到了一句关于代码中哈希表的注释:具体记不清楚了,大概有个单词是coarse,意识是说,该哈希表的锁粒度实在是太粗了,以后再细化。 确实,非常粗,多个工作线程对它的互斥竞争比较强烈。 2.解决方案:首先,想把哈希表拆成多个小表,怎么拆呢?

2011-07-03 15:03:19 813

原创 MEMCACHED(4)——哈希表

1. 最初看见assoc.c文件,发现了两个哈希表primary_hashtable和old_hashtable,还以为是采用了传说中的perfect hash,再仔细看完该文件,雷! 2.MEMCACHED只是简单的对哈希表做扩充,在装载因子大于1.5的时候

2011-07-03 14:54:33 1006

原创 MEMCACHED(3) SLAB内存池

1. 对这个SLAB内存池实在没什么好说的,比较直白。简单介绍一下各个参数吧。 2. setting的与SLAB相关的参数  chunk_size:这是SLAB所存储的最小对象大小,包括sizeof(item) + key + value。 item_size

2011-07-03 14:44:50 1414

原创 MEMCACHED(2) 网络线程模型

1  MEMCACHED的网络线程模型结构和之前公司的网游服务器底层很相似。首先,主线程采用非阻塞ACCEPT,它也只干这一件事情,将新连接按照RR轮转,投递给一个工作线程;投递的方法稍有蹊跷,将新连接PUSH到选定的工作线程的CQ队列中,该队列是线程安全的。

2011-07-03 14:28:03 815

原创 memcached(1)

1.memcached参数解读 "p:"  /* TCP port number to listen on */    这是监听套接字所绑定的端口号,对应的变量是settings.port; "U:"  /* UDP port number to listen on */   UDP套接口所绑定的端口号,对应的变量是settings.udpport;   进程会创建两种类型的套接字用于服务。其实还

2011-07-03 14:16:57 881 1

原创 asio: FOLLOWER-LEADER模式

<br />BOOST 的EPOLL封装,采用了所谓的领导者追随者模式。<br />我们知道EPOLL_WAIT是不能多线程调用的;<br />ASIO为了在LINUX下模拟PROACTOR模式,用应用层的数据结构模仿了WINDOWS系统给IOCP实现的完成包队列,<br />以及IO请求包;<br />为了模拟IOCP多个工作者线程调用GETQUEUEDCOMPLETEDSTATUS,<br />由于无法并发EPOLL_WAIT,采用了领导追随模式,做了个大概的模拟。<br /><br />怎么给人的感觉

2011-05-19 14:14:00 1187 1

翻译 TOLUA++初探

1. 编写一个C++类测试:#if !defined(__TEST_H)#define __TEST_Hclass Test{ public: explicit Test(int val = 9); void Print() const; static Test* Clone(int val); private: int m_val;};#endif////////////////#include #in

2011-05-19 13:59:00 705

原创 一个简单的元编程例子

<br />在asio中有这么一段代码<br />template <typename Stream>char is_read_buffered_helper(buffered_stream<Stream>* s);template <typename Stream>char is_read_buffered_helper(buffered_read_stream<Stream>* s);struct is_read_buffered_big_type { char data[10]

2011-05-09 12:55:00 644

原创 ascent的网络模块简析

ascent 2010的网络模块代码采用了IOCP,代码量很小。带着以下问题溜了一遍:1.IOCP的乱序问题如果同时对一个socket投递多个recv或者send请求,那么应用层会将TCP辛辛苦苦保证的有序给打乱。解决办法很简单,串行投递。这对于服务器程序来说是可行的,毕竟它管理的是成百上千个sockets,每个2请求,那IOCP要处理的也很多了。ascent也是这么做的(从socket类只含有两个overlap对象一眼看出)。但不是强制:发生了重复投递,它只是写了一条错误日志。2. send操作能否避开锁

2011-04-22 19:12:00 688

原创 程序调试总结 04-18

<br />1.现象:程序中调用DLL中的某个函数f,但是断点跟踪,却调用了函数g而不是f<br />经调试,在call eax这条汇编语句中,查出函数地址就是g的地址;而f和g的地址只差4个字节;<br />于是检查DLL头文件,找出了原因:dll和h文件不匹配<br /> <br />2.现象:某个对象内有一个map成员,后来在某个地方遍历该map时抛出了异常。<br />  经调试,发现该map已经被损坏,内部的头指针为0;<br /> 于是在该对象的map成员前后各加了一个char变量,再调试,当然

2011-04-19 09:33:00 472

原创 客户端网络消息在assert时重复解析的问题

<br />在wndproc调用之中进行网络消息的处理,如果这个过程中又有新网络报到来,新的窗口消息通知会延迟到wndproc调用完;这正常。<br />但是如果winproc处理网络消息时准备弹个assert窗,且此时却是有新网络报到来,<br />那新窗口消息就立即来了<br />跟windows窗口消息机制有关,具体不了解。

2011-01-19 15:04:00 440

转载 gch文件之浅谈GCC预编译头技术 收藏

其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA。后来一直用到C++ Builder,尽管Borland的广告无时无刻不在吹嘘其编译速度,我却从没有对这个问题上心过,因为心里根本没有“编译速度慢”这种概念。没有坏, 哪来好?所谓矛盾的对立统一。遇到的第一个“慢”的编译器也许是javac,但因为Java的特殊性,也就容忍了。真正接触到世间的“恶势力”,还要算是 第一次使用GCC的时候……准确地说是MinGW。开源世界曾给我诸多惊喜,其一就是原来编译器也可以这么慢

2010-12-27 10:54:00 3553

原创 奇变偶不变,符号看象限

<br />上午看了一下物体的移动部分代码,简直晕头转向。<br />花了一个多小时算是搞明白了。<br />要到达一个目标targetPOSITION,计算目标点与原来坐标的两点表示的矢量与x轴夹角,用反余弦得到弧度表示。<br /> <br />由于计算机的acos函数返回的是0到PI弧度,所以弧度对应的正弦值一定大于0<br /> <br />但是当目标targetPOSITION的纵坐标值小于原来坐标的纵坐标时,也就是目标点在“下方”,<br /> <br />需要将sin值变号,又保持cos不变;

2010-09-29 11:21:00 2253

转载 避免窗口闪烁 (双缓冲等等)

<br />如果一个程序出现闪烁现象,会让人觉得程序编写人员很马虎,缺乏对细节的足够重视。Windows程序的任何部分都没有任何理由出现闪烁现象。这篇文章的目的是告诉读者如何使用相关的技术防止窗口出现闪烁效果。 什么是闪烁<br />闪烁可以这样定义:当后面一幅图像以很快的速度画在前面一幅图像上时,在后面图像显示前,你可以很快看到前面那一个图像,这样的现象就是闪烁。我认为,闪烁会让使用者对程序很不满,原因是:如果用户接口编码如此糟糕,那么程序的其他部分呢,如何能相信数据的正确性呢?一个具有平滑,快速相应的程

2010-08-20 10:00:00 693

原创 IOCP相关的一些总结

1:在IOCP中投递WSASend返回WSA_IO_PENDING的时候,表示异步投递已经成功,但是稍后发送才会完成。这其中涉及到了三个缓冲区。网卡缓冲区,TCP/IP层缓冲区,程序缓冲区。情况一:调用WSASend发送正确的时候(即立即返回,且没有错误),TCP/IP将数据从程序缓冲区中拷贝到TCP/IP层缓冲区中,然后不锁定该程序缓冲区,由上层程序自己处理。TCP/IP层缓冲区在网络合

2010-06-17 14:56:00 2318

原创 mangos的Database模块

刚刚简单看了一下mongos的数据库模块。它没有提供一个单独的服务进程来操作数据库,而是在每个需要访问数据库的服务进程内,对每个需要访问的数据库建立一条连接,并随之启一个异步查询线程(不知这样描述是否准确,大概就是说,数据库语句放入一个队列,该线程会从这个队列里取,执行真正的查询。当然,这类查询一般是无返回值的,不会是select语句)1. Database是一个基类,不同的数据库有针对它的不同实现;提供了mysql和sqlite两种实现。该类的一个对象封装了一条数据库连接,并有一个辅助的异步查询线程;2.

2010-06-12 18:15:00 903 1

转载 为什么不应该使用“volatile”类型

<br />C programmers have often taken volatile to mean that the variable could be<br />changed outside of the current thread of execution; as a result, they are<br />sometimes tempted to use it in kernel code when shared data structures are<br />being used.

2010-06-09 16:17:00 1191 1

原创 安装mysql

因为马上要做一个mysql的C api封装。以前装mysql都是用yast搞定这次下载了源码,一顿configure,make,make install启动mysqld-safe时总是出现一些错误,大多是权限不够,加个选项--user=root来启动就差不多了; 最后又从日志发现一错误 File ./mysql-bin.index not found 好像是什么二进制日

2010-05-21 10:25:00 577

翻译 记录一些简单实用的vim用法

lsof -i:6789查看哪些进程占用了6789端口1.假如有这么一句  #include "SocketTask.h"如果想查看这个文件内容,那么就把光标放上面,输入命令gf~好记吧  2.:q是退出;   q:呢?是查看输入的命令历史  3.  寄存器命令 用q命令,后面跟寄存器名字(单个字母假设是a),开始记录你的命令输入; 最后

2010-05-18 10:45:00 3384 1

原创 一种在编译期保证模板类参数T必须实现某函数的方法

我们平时写一个模板类,声明大概如下 template class TaskManager{ vector tasks; void ParseEveryTask() { vector::iterator it = tasks.begin(); while ( it!=tasks.end() ) { it->parse();//注意,T必

2010-04-11 13:31:00 715

转载 epoll ET mode with tcp nonblocking socket

epoll ET mode with tcp nonblocking socket(linux kernel 2.6.18)[b]现假设A, B建立了tcp连接,且A可写[/b]1) 2.6.18并未实现真正意义上的 edge triggered, 事件会报多次,比如socket可写,这时tcp接收到有5bytes,触发EPOLLIN | EPOLLOUT,不管应用层是否read()掉这5byte

2010-03-22 16:27:00 1683

原创 快速选择——寻找第k小的数

据KNUTH证明,此方法是线性的。。。不理解。。。#include #include #include #include #define N 10void Swap( int * a, int * b){ int tmp = *a; *a = *b; *b = tmp;}int Partion(int a[], int n, int k)

2010-03-21 20:38:00 627

原创 优先级队列 (小根堆)

#include #include #include using namespace std;// 小根堆template class PriQueue{ T * queue; int cnt;public: PriQueue() : queue ( NULL ), cnt(0) { queue = new T[N](); } ~Pri

2010-03-20 16:52:00 1459 1

翻译 最大子序列

要求: 一个整数数组,可能有负数;求它的最大子序列和;如果都是负数,那么最大子序列和定义为最大的那个元素值; 1.很容易想到这个平方算法:int MaxSequence(int a[], int n) // n * n{ int max = a[0]; int sum ; int i, j; for ( i=0; i<n; ++i) { sum = 0

2010-03-19 20:01:00 492

原创 C++ const变量机制

#include int main(){ const int a = 10; int * p = (int *)&a; unsigned long addr = (unsigned long )&a; *p = 0; printf("%d/n", *p);// 0 printf("%d/n", a);// 10 printf("%d/n", *(int*)add

2010-03-18 15:01:00 470

原创 第1二分查找

其实是传统二分查找的一点变形:需要找到数组中出现的第一个元素。比如数组元素是 1  2  2  2   3  4   5查找2的话,返回数组下标为1,而不是2或者3 # include int FirstBinSearch(int a[], int n, int key){ int l = 0, r = n-1; int ret = -1; while( l

2010-03-17 14:21:00 559

原创 LUA在网游任务中的应用

LUA生来是与游戏相关的;自从魔兽将它发扬光大之后,越来越多的游戏公司使用它。游戏逻辑中与其密切相关的是访问NPC部分,弹出一个交易框、打造框、任务对话框等等,这些基本都是由LUA实现;本文我想就自己最近的一点儿体会,写下关于游戏任务的lua实现; 去年12月份,新游戏项目成立,分配给我的第一个任务就是编游戏任务;当时我还不知lua为何物,先花了一天的时间基本熟悉了lua语法(主要

2010-03-15 19:28:00 2433 1

原创 论坛上一题目

请问这个程序的输出:int func(int i,int n){ return (i<n && printf("%d/n",i)) && !func(i+1,n) || printf("%d/n",i);}  感觉就是考短路、递归;要知道||低于&&简单分析:1.当i>=n, 打印i,函数退出;2.否则,打印i,递归调用;  如果递归调用的返回值是非0,

2010-03-15 17:11:00 696

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除