zoukankan      html  css  js  c++  java
  • Apache Thrift的C++多线程编程定式

     

    Facebook贡献给Apache的开源RPC组件Thrift有着广泛的应用,C++中使用Thrift也十分普遍,但由于ThriftHandler会被多个线程调用,因而多线程中应用并不直接的友好,利用C++的“thread_local”特性或GCC的“__thread”特性可化简这一问题。

    看具体实例,有一Thrift serviceXService,编译后生成接口文件XServiceIf,接口的实例类为XHandler

    class XHandler: public XService

    {

    };

     

    由于XHandler会被多个线程调用,直接使用起来需要加锁,不是那么方便。为此引入线程级类XHelper:

    class XHelper

    {

    };

     

    XHanlder不做具体的实现,全部委托给XHelper,把XHelper定义为线程级变量:

    // stg: Static Thread Global

    #if __cplusplus < 201103L

        static __thread XHelper* stg_xhelper;

    #else

        static thread_local XHelper* stg_xhelper;

    #endif // __cplusplus < 201103L

     

    新的实现就完全不用关心多线程了:

    static bool init_xhelper() {

        if (NULL == stg_xhelper) {

            stg_xhelper = new XHelper;

            if (!stg_xhelper->init()) {

                delete stg_xhelper;

                stg_xhelper = NULL;

            }

        }

        return stg_xhelper != NULL;

    }

     

    void XHandler::foo() {

        if (init_xhelper()) {

            stg_xhelper->foo();

        }

    }

     

    void XHelper::foo() {

    }

     

     

     

  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/aquester/p/10554225.html
Copyright © 2011-2022 走看看