ユーザ用ツール

サイト用ツール


Sidebar

ミドルウェア系:apacheモジュール:thread_mutexの実装

Thread Mutexの実装

  • Global Mutexにすると、preforkされた複数のプロセス間でLockをとるので、プロセス間通信でLockしたい場合以外などでは効率が悪い。
  • 単にスレッドセーフな実装にしたい場合は、一番簡単で効率もそこそこ良いのでThread Mutex。
  • Apache API上ではGlobalもThreadもMutexの実装は抽象化されていてほぼ同じ。

まずはmutexを定義

apr_thread_mutex_t *mod_mruby_mutex;

次に、init処理の中ぐらいでmutexをcretate

    apr_status_t status = apr_thread_mutex_create(&mod_mruby_mutex, APR_THREAD_MUTEX_DEFAULT, p);
    if(status != APR_SUCCESS){
        ap_log_error(APLOG_MARK
            , APLOG_ERR        
            , 0                
            , NULL             
            , "%s ERROR %s: Error creating thread mutex."
            , MODULE_NAME
            , __func__
        );
 
        return status;
    }   

Lockをとりたい処理の直前でLock

    if (apr_thread_mutex_lock(mod_mruby_mutex) != APR_SUCCESS) {
        ap_log_error(APLOG_MARK
            , APLOG_ERR
            , 0
            , NULL
            , "%s ERROR %s: mod_mruby_mutex lock failed"
            , MODULE_NAME
            , __func__
        );
        return DECLINED;
    }

終わったらUnlock

    // mutex unlock
    if (apr_thread_mutex_unlock(mod_mruby_mutex) != APR_SUCCESS){
        ap_log_error(APLOG_MARK
            , APLOG_ERR
            , 0
            , NULL
            , "%s ERROR %s: mod_mruby_mutex unlock failed"
            , MODULE_NAME
            , __func__
        );
        return OK;
    }

これで幸せになれます。

ミドルウェア系/apacheモジュール/thread_mutexの実装.txt · 最終更新: 2013/04/29 12:14 by matsumoto_r