當前位置:編程學習大全網 - 源碼下載 - MySQL數據庫線程緩沖池詳解

MySQL數據庫線程緩沖池詳解

 MySQL數據庫線程緩沖池的相關知識是本文我們主要要介紹的內容 MySQL數據庫支持線程緩存 在多線程連接模式下 如果連接斷開後 將這個線 程放入空閑線程緩沖區 在下次有連接到來時 先去緩沖池中查找是否有空閑線程 有則用之 無則創建 啟動時可以設置線程緩沖池的數 目 Mysqld exe thread_cache_size=

 在壹個連接斷開時 會調用cache_thread函數 將空閑的線程加入到cache中 以備後用 源碼如下

以下是代碼片段 static bool cache_thread() { safe_mutex_assert_owner(&LOCK_thread_count); if ( cached_thread_count < thread_cache_size && ! abort_loop && !kill_cached_threads) { /* Don t kill the thread just put it in cache for reuse */ DBUG_PRINT("info" ("Adding thread to cache")); cached_thread_count++; while (!abort_loop && ! wake_thread && ! kill_cached_threads) (void) pthread_cond_wait(&COND_thread_cache &LOCK_thread_count); cached_thread_count ; if (kill_cached_threads) pthread_cond_signal(&COND_flush_thread_cache); if (wake_thread) { THD *thd; wake_thread ; thd= thread_cache get(); thd >thread_stack= (char*) &thd; // For store_globals (void) thd >store_globals(); /* THD::mysys_var::abort is associated with physical thread rather than with THD object So we need to reset this flag before using this thread for handling of new THD object/connection */ thd >mysys_var >abort= ; thd >thr_create_utime= my_micro_time(); threads append(thd); return( ); } } return( ); }

 上面我們的啟動參數設置線程緩沖區為 此時對應代碼裏面的thread_cache_size = cached_thread_count記錄

 了此刻cache中的空閑線程數目 只有在cache未滿的情況下 才會將新的空閑線程加入緩沖池中 加入到緩沖區其實就是將線

?

 程掛起 pthread_cond_wait函數便是線程等待函數 在此函數中 會調用WaitForMultipleObjects進行事件等待 具體源碼

 如下

以下是代碼片段 int pthread_cond_timedwait(pthread_cond_t *cond pthread_mutex_t *mutex struct timespec *abstime) int result; long timeout; union ft now; if( abstime != NULL ) { GetSystemTimeAsFileTime(&now ft); /* Calculate time left to abstime subtract start time from current time(values are in ns units) convert to millisec by dividing with */ timeout= (long)((abstime >tv i now i ) / ); /* Don t allow the timeout to be negative */ if (timeout < ) timeout= L; /* Make sure the calucated timeout does not exceed original timeout value which could cause "wait for ever" if system time changes */ if (timeout > abstime >max_timeout_msec) timeout= abstime >max_timeout_msec; } else { /* No time specified; don t expire */ timeout= INFINITE; } /* Block access if previous broadcast hasn t finished This is just for safety and should normally not affect the total time spent in this function */ WaitForSingleObject(cond >broadcast_block_event INFINITE); EnterCriticalSection(&cond >lock_waiting); cond >waiting++; LeaveCriticalSection(&cond >lock_waiting); LeaveCriticalSection(mutex); result= WaitForMultipleObjects( cond >events FALSE timeout); EnterCriticalSection(&cond >lock_waiting); cond >waiting ; if (cond >waiting == ) { /* We re the last waiter to be notified or to stop waiting so reset the manual event */ /* Close broadcast gate */ ResetEvent(cond >events[BROADCAST]); /* Open block gate */ SetEvent(cond >broadcast_block_event); } LeaveCriticalSection(&cond >lock_waiting); EnterCriticalSection(mutex); return result == WAIT_TIMEOUT ? ETIMEDOUT : ; }

 此處是等待時間 何處進行事件通知呢?我們再次來到上篇所提及的為新的連接創建線程的代碼中

以下是代碼片段 void create_thread_to_handle_connection(THD *thd) { if (cached_thread_count > wake_thread) { /* Get thread from cache */ thread_cache append(thd); wake_thread++; pthread_cond_signal(&COND_thread_cache); } Else } ? lishixinzhi/Article/program/MySQL/201311/29579

  • 上一篇:手機裏的計算器源代碼在哪裏?
  • 下一篇:世界上最豪華的巴士移動膠囊酒店
  • copyright 2024編程學習大全網