`
splayx
  • 浏览: 82624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
今天在优化项目,看了几个关键路径上的调用, 有些是可以并发的,有些是需要加写锁的, 如果想在整条调用路径上做文章相当复杂,需要时间做不少分析, 接着又发现虽然不少地方都有写锁,但是真正触发这些写锁的机会不是很大。   在这种情况下,突然有一种想法,就是另写一条没有写锁的调用路径, 无写锁路径上的方法写法十分简单,在原本方法触发写锁的地方直接返回调用失败就好了, 若无写锁路径调用失败,再调一次原始的路径也就OK了。   简单说来就是这样: if (!MethodReadOnly()) { return Method(); }   bool MethodRea ...
auto 在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期, 这个关键字不常用,因为即便省略,声明的默认就是auto的。 在C++11中,auto的含义改变为自动通过初值符推断声明的类型占位符。 也可以使用auto& ...
  只有在root权限才可以创造新的linux用户   adduser ab 创造名为ab的用户, 新用户是没有密码的,注意没有密码的用户不能用户登录。   passwd ad 给用户ab设置密码。 在终端可以看到: Changing password for user ab. New UNIX password:  BAD PASSWORD: it is based on a dictionary word Retype new UNIX password:  passwd: all authentication tokens updated successfu ...
即Level-Triggered and Edge-Triggered   简单说来 Level-Triggered: 只要事件是处于就绪状态,你每询问一次,就告诉你一次它处于就绪状态。 Edge-Triggered: 只有在状态改变的时候告诉你,这也是为什么et模式下,建议用非阻塞的socket。   下面我们来看看epoll对于两类触发是怎么返回给用户的。 当用户调用epoll_wait时会返回一组事件,包括水平触发的或边缘触发的。   epoll中有两个重要的数据结构红黑树rbt,和一个就绪列表ready-list。 调用epoll_wait时其实就是从read ...
今天在思考一个问题: 两个线程访问一个变量A(初始化值是0),一个线程写(准备写的值是0xFF),一个线程读。 在没有锁的情况下,读的线程有没有可能读到的值是0x0F或0xF0。   为什么有这么一个疑问, 因为看到很多代码都是假设这个情况是不可能发生的。   最后在 http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic 以及其他地方找到答案。   简单说来跟CPU的数据总线宽度有关,也跟cpu的cache策略有关, 但只要是地址关于总线宽度是对齐的,就能保证上 ...

TCP编程基础

    博客分类:
  • net
http://learn.akae.cn/media/ch36s01.html(协议栈) 关于网络序列 因为网络连接可能建立在big-endian和little-endian的机器之间。 详见这篇文章http://splayx.iteye.com/blog/1739223   所以端口(port)、地址(ip)有必要从主机的字符顺序转为网络的字符顺序, 网络的字符顺序作为不同机器之间通讯的中间载体。linux(<arpa/inet.h>)提供了4个转化的操作。 uint32_t htonl(uint32_t hostlong); uint16_t htons( ...
先看一段代码。 #include <iostream> using namespace std; class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } }; class B : public A { public: B() { cout << &q ...
最近手贱把yum卸载了,搜来搜去找不到解决方案。 最后PE回答了我的问题。   如果把yum卸载了,可以去找yum的rpm包来安装。 在http://rpm.pbone.net上找出下面的rpm包,   yum-metadata-parser-1.1.2-2.el5 yum-3.2.19-18.el5 yum-rhn-plugin-0.5.3-30.el5 yum-security-1.1.16-13.el5 yum-updatesd-0.9-2.el5 我的机器选的是x.noarch.rpm。   然后逐一执行rpm安装指令: rpm -ivh x.noarch ...

虚函数的一些解释

    博客分类:
  • C++
C++的行为规定是, 每个有虚函数的类,会有一张虚函数指针表,这张虚函数指针表指向最后实现的虚函数。 用指向派生类的基类指针调用函数时就会访问这张表。 从而体现了C++的多态技术,即指向派生类的基类指针可能有 ...
extern的连接发生在编译时的连接阶段, 但是看下面的代码中add()函数没有被调用, extern void add(); int main() { return 0; }  此时没有定义add却没有编译问题,编译器的这个行为也不难理解。 因为add没有被调用,所以没定义也没关系。   extern void add(); int main() { add(); return 0; } 这样编译就不能成功,因为找不到add()的定义 test.cpp:(.text+0x5): undefined reference to `ad ...

URL的正则表达式

    string pattern = "(((http[s]{0,1}|ftp)://)?[a-zA-Z0-9\\.\\-]+\\.(com|cn|net|com\\.cn|org|biz|name|info|tv|cc|([a-zA-Z]{2,6}))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&amp;*+?:_/=<>]*) ?)";  能够优先匹配有这些com|cn|net|com\\.cn|org|biz|name|info|tv|cc|后缀的,   最后再看[a-zA-Z]{2,6}是否匹配得上。   ...

ldb中log的读写分析

    博客分类:
  • ldb
  log的读涉及到的关键变量如图所示。log文件在物理上是分块存储的,而在逻辑上一个个record存储的。 一个record可能跨越了几个block,所以每个record可能会被分为几个record,分别存储。   record的结构是[uint32_t crc32c校验][uint16_t 数据长度][uint8_t 类型] log文件涉及到的record类型有 FULL      == 1 FIRST     == 2 MIDDLE  == 3 LAST      == 4 从字面意思我们可以很容易看出他们的作用。 这个类型可以有其他类型的,只是被log模块忽略。 ...
复杂的类型使用引用,可以减少拷贝而提高性能; 如果不希望引用被修改则带上const标志。   但是对于简单类型,如果是处于性能原因而使用引用, 那肯定是弄巧成拙的。因为使用引用之后,多了一些额外的索引标志, 这些的带来的消耗在时间和空间上都比不用引用要多一些。 使用gcc -S x.cpp -o x.s得到下列的代码的汇编的大小   int add(int a, int b) { return a + b; }  963Bytes   int add(const int &a, const int &b) { return a + ...
python在打印字符串的时候会把目标串转成unicode编码, 然后在转换成平台指定的编码例如utf-8,ascii等格式。不同版本的python有默认encode方式。 python3.2: print(sys.getdefaultencoding())utf-8  python2.7:print sys.getdefaultencoding()ascii 如果encode的格式跟字符串原先的格式不同(或者说不兼容)就会出错。 UnicodeEncodeError: 'ascii' codec can't encode characters in position xx-yy ...

static和const的使用

    博客分类:
  • C++
static 文件域+位置域(局部,类) 在一个类中声明了,在类外定义,static变量定义时所在的文件,就构成了该变量的作用范围。 一个类的static变量,如果在头文件中定义, 多个其他文件include这个文件的时候,就会使得这个static有多个实体。 也就是一个类定义了多个static变量,然后就会报错! 因为这个变量的作用域是由文件,类两者确定的,通过文件那一关,却没有通过类那一关。 所以类的static变量一般在类的定义文件cpp中定义,即初始化。  t.h #ifndef _ZJJTT_ #define _ZJJTT_ #include <s ...
Global site tag (gtag.js) - Google Analytics