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

    }

     

     

     

  • 相关阅读:
    数据管理(五)
    (译文)Gentoo的前世今生 part3 (完成版※)
    数据管理(三)
    数据管理(一)
    数据管理(七)
    (译文)Gentoo的前世今生 PART 1(完成版)
    数据管理(六)
    数据管理(四)
    SQL Server补丁版本的检查和安装过程中常见问题
    3938 Portal(离线型的并查集)
  • 原文地址:https://www.cnblogs.com/aquester/p/10554225.html
Copyright © 2011-2022 走看看