• 2012-12-19

    SSDB – 支持 zset 的 LevelDB 服务器

    Views: 36334 | No Comments

    Google 开源的 LevelDB 是一个单纯的 key-value 存储的类库, 可以理解为是一个存储引擎, 并不是常见意义的服务器. 你无法通过网络接口来使用它, 只能用 C/C++ 语言才能使用它.

    LevelDB 速度非常快, 是 Google 内部分布式存储系统 Bigtable 的存储引擎的开源版本, 作为分布式系统的一个存储节点(Tablet). LevelDB 的设计思想和 Google 内部的版本部分相同, 但肯定也被隐藏了一些接口和思想, 而这部分很可能是非常重要和关键的.

    Continue reading »

    Posted by ideawu at 2012-12-19 13:48:10 Tags: ,
  • 2012-11-16

    必须放在循环中的pthread_cond_wait

    Views: 15506 | No Comments

    消费者线程(多个):

    // *错误做法*
    lock(my_lock){
        if(wait = 1){
            pthread_cond_wait(cond, my_lock);
        }
        wait = 1;
    }
    

    生产者线程:

    lock(my_lock){
        wait = 0;
        pthread_cond_signal(cond);
    }
    

    由于在 if(wait=1) 之后和 pthread_cond_wait() 在之前, wait 有可能已经被其它消费者线程更改了.

    所以, 必须把 pthread_cond_wait() 放在循环中:

    // 正确做法
    lock(my_lock){
        while(wait = 1){
            pthread_cond_wait(cond, my_lock);
        }
        wait = 1;
    }
    
    Posted by ideawu at 2012-11-16 18:36:55
  • 2012-11-16

    C++成员函数作为pthread_create参数

    Views: 12051 | No Comments

    很久以前已经说过, C++指向类成员函数的指针非常变态, 如果要把类成员函数作为线程 pthread_create 的参数, 就更复杂!

    class A{
    public:
        void run(){
        }
    
        static void *run_helper(void *arg){
            ((A *)arg)->run();
            return (void *)NULL;
        }
    };
    
    A a;
    pthread_t t;
    pthread_create(&t, NULL, &A::run_helper, &a);
    

    本来我们希望把 a.run 作为参数, 为此, 必须创建一个 static 的 run_helper() 函数, 然后在 run_helper() 中调用 run().

    Posted by ideawu at 11:02:04
  • 2012-11-12

    吐槽面向对象的C++编程语言

    Views: 10391 | No Comments

    最近不得不又重新拿起"面向对象的C++编程语言", 又禁不住要发感慨. 虽然之前已经对C++中指向类函数的指针发过感慨了, 还听过Linus对C++的各种不屑. C++, 真是解决一千个问题的同时又恶心一千个程序员.

    多重继承(Multiple Inheritance)

    在我看来, C++之恶很大一部分来源于违反自然伦理的"多重继承(Multiple Inheritance)", 也就是一个子类可以同时拥有多个直接的父类, 这就相当于一个怪胎是由两个以上的精子发育而成的! 所有支持多重继承的编程语言(包括C++和Python), 调用父类方法的语法都非常的繁琐和恶心.

    C++的多重继承导致了什么问题? 它导致了这些问题:

    1. 构造函数不能继承 -- 子类如果想拥有父类的所有构造函数, 必须重新再定义一遍!

    2. 指向类的函数的指针变得毫无意义.

    3. 各种各样为了解决多重继承而"发明"的语法糖...

    虚函数(virtual method)

    有C++程序去学习Java时, 总结出"Java的所有成员函数都是虚函数". 为什么要这么总结? 原来, C++的子类函数不能自动覆盖父类函数, 所以才又"发明了"虚函数的概念...

    这又是C++违反自然规律的地方, 覆盖当然是应该的. 而C++竟然因为观察解角度的不同(指向对象的不同指针类型), 而看到不同的方法...

    再吐槽面向对象编程

    面向对象的思想的确是分析业务对象的绝妙方法, 但面向对象的编程语言的表达能力就让人实在不敢恭维. 目前为止, 所有的面向对象编程语言的三个特性: 封装, 继承, 多态, 除了"封装"是一种思想, 继承和多态都无法表达业务模型, 只能用来做代码封装. 如果一个人发现了业务对象的继承关系, 便立即写两个类来继承的话, 那么他肯定是走火入魔了. 类(代码)是否应该继承, 取决于代码本身, 与业务无关.

    C和C++

    目前, 一个系统如果要作为基础服务的话, 一般要用C或者C++来编写才能让人信服. Java能替代一些, 但还远远不够, 自然选择的结果也是这样的. C语言的一主要问题有这几个: 没有命名空间和类, 缺少一些广泛使用的通用库. 但C++的各种模型和规则等等, 又非必要. 所以, 只要C语言增加Java的对象模型, 再允许函数直接处于包之中, 就足够了, 有没有智能GC并不重要.

    虽然已经多年不写Java了, 同时也对Java静态类型以及某些繁琐语法不爽, 但还是偶尔会怀念Java. 据说, Java发明过程, 很大一部分就是参照C++做加法和减法.

    Posted by ideawu at 2012-11-12 00:08:24
  • 2012-11-09

    在 Windows(Cygwin) 环境下编译 levelDB

    Views: 33315 | No Comments

    levelDB 本身不支持 Windows 平台, 在 Cygwin 里编译的话, 也会报"Unknow platform"错误. 只需要做一下简单修改, 就能在 Windows 下编译和 levelDB. 首先, 要安装 gcc-4, 而不是 gcc-3.

    修改 build_detect_platform, 增加 CYGWIN_* 内容:

    case "$TARGET_OS" in
        CYGWIN_*)
            PLATFORM=OS_LINUX
            COMMON_FLAGS="$MEMCMP_FLAG -lpthread -DOS_LINUX -DCYGWIN"
            PLATFORM_LDFLAGS="-lpthread"
            PORT_FILE=port/port_posix.cc
            ;;
    

    Continue reading »

    Posted by ideawu at 2012-11-09 14:55:12 Tags:
  • 2012-07-21

    众所期待 – 真正的类C通用型脚本编程语言出世了!

    Views: 36776 | 34 Comments

    虽然是借鉴了C语言的语法, 使用了Python语言的模型和运行环境, 但它是一个真正的*中国人自己完全自主发明创造的拥有自主知识产权的*(^_^)通用型脚本动态脚本编程语言, 而且是一个21世纪的编程语言, 在2012年这个世界末日之年正式诞生!

    它能做什么?

    它是通用型编程语言, 是一种动态语言, 是一种脚本语言, 可以用来做日常的文本处理, 也可以用来开发网络服务器和客户端, 可以用来做企业级开发... 总之, 只要Python能做的, 它就能做. 它和Python唯一的不同就是: 它是类C语法的! 这就避免了Python那种悬空的摇摇欲坠的混乱的代码风格的缺点, 有助于大型项目代码的开发.

    而且, 它能复用所有的Python内置模块和所有你写出来的Python代码, 你只需要简单的import它们即可.

    先来一个简洁的的例子吊一下你的胃口:
    Continue reading »

    Posted by ideawu at 2012-07-21 12:57:12 Tags:
|<<<5678910111213>>>| 11/13 Pages, 77 Results.