熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL數據庫線程緩沖池詳解

2022-06-13   來源: MySQL 

  MySQL數據庫線程緩沖池的相關知識是本文我們主要要介紹的內容MySQL數據庫支持線程緩存在多線程連接模式下如果連接斷開後將這個線 程放入空閒線程緩沖區在下次有連接到來時先去緩沖池中查找是否有空閒線程有則用之無則創建啟動時可以設置線程緩沖池的數 目Mysqldexe 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)
{
/* Dont 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_cacheget();
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();
threadsappend(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(&nowft);
/*
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>tvi nowi) / );
/* Dont 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; dont expire */
timeout= INFINITE;
}
/*
Block access if previous broadcast hasnt 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 == )
{
/*
Were 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_cacheappend(thd);
wake_thread++;
pthread_cond_signal(&COND_thread_cache);
}
Else

}  

  關於MySQL數據庫線程緩沖池的相關知識就介紹到這裡了希望本次的介紹能夠對您有所收獲!


From:http://tw.wingwit.com/Article/program/MySQL/201311/29579.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.