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

    }

     

     

     

  • 相关阅读:
    Oracle 字符集的查看和修改
    Hibernate查询方法与缓存的关系
    Oracle Sql语句整理
    Android动画效果
    Acrobat9键盘快捷键
    Head区的设置
    JAR,WAR,EAR区别
    ASCII码表完整版
    HTML的meta标签详解
    .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法
  • 原文地址:https://www.cnblogs.com/aquester/p/10554225.html
Copyright © 2011-2022 走看看