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() {

    }

     

     

     

  • 相关阅读:
    F. Journey
    D. Divide
    C. Counting Pair
    A. A Big Dinner
    E
    D -Sale
    第十三课 历史记录画笔工具
    第十二课 文字工具
    第十一课 模糊工具、海绵工具、仿制图章工具
    第十课 切片工具 修复画笔工具 修补工具 颜色替换工具
  • 原文地址:https://www.cnblogs.com/aquester/p/10554225.html
Copyright © 2011-2022 走看看