共計 1472 個字符,預計需要花費 4 分鐘才能閱讀完成。
今天就跟大家聊聊有關 Mysql 中 Thread Manager 的作用是什么,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。
1. 線程創(chuàng)建函數(shù)
大家知道,Mysql 現(xiàn)在是插件式的存儲引擎,只要實現(xiàn)規(guī)定的接口,就可實現(xiàn)自己的存儲引擎。故 Mysql 的線程創(chuàng)建除了
出現(xiàn)在主服務器框架外,存儲引擎也可能會進行線程的創(chuàng)建。通過設置斷點,在我調試的版本中,發(fā)現(xiàn)了兩個創(chuàng)建線程的函數(shù)。
os_thread_create 是存儲引擎 innobase 的線程函數(shù),先擱淺不研究了,重點看下 pthread_create,首先看下其源碼。
map- func=func; map- param=param;
hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start, attr- dwStackSize ? attr- dwStackSize : 65535, (void*) map);
上面代碼首先構造了一個 map 結構體,成員分別是函數(shù)地址和傳入?yún)?shù)。然后調用操作系統(tǒng)的接口,_beginthread, 但是執(zhí)行函數(shù)并不是傳入的函數(shù) mdash; mdash;func,而是 pthread_start, 參數(shù)為 map。繼續(xù)跟蹤 pthread_start。
func=((struct pthread_map *) param)- func
可以看出,pthread_start 中調用了 map 的 func 元素,作為真正執(zhí)行的函數(shù)體。OK, 創(chuàng)建線程的函數(shù)跟蹤到此!
2. 服務器啟動時創(chuàng)建了哪些函數(shù)?
通過在兩個創(chuàng)建線程的地方設置斷點,總結了下,在服務器啟動時,創(chuàng)建了如下的線程。
pthread_create 創(chuàng)建的線程:
innobase 的 os_thread_create 創(chuàng)建的線程:
還可以在調試過程中,通過暫停來看此時服務器中的線程,如下圖:
三、線程緩沖池
Mysql 支持線程緩存,在多線程連接模式下,如果連接斷開后,將這個線程放入空閑線程緩沖區(qū),在下次有連接到來時,
先去緩沖池中查找是否有空閑線程,有則用之,無則創(chuàng)建。啟動時可以設置線程緩沖池的數(shù)目:
在一個連接斷開時,會調用 cache_thread 函數(shù),將空閑的線程加入到 cache 中,以備后用。如下:
cached_thread_count thread_cache_size
pthread_cond_signal(COND_flush_thread_cache);
上面我們的啟動參數(shù)設置線程緩沖區(qū)為 10,此時對應代碼里面的 thread_cache_size = 10,cached_thread_count 記錄
了此刻 cache 中的空閑線程數(shù)目,只有在 cache 未滿的情況下,才會將新的空閑線程加入緩沖池中。加入到緩沖區(qū)其實就是將線
程掛起,pthread_cond_wait 函數(shù)便是線程等待函數(shù),在此函數(shù)中,會調用 WaitForMultipleObjects 進行事件等待。具體源碼
如下:
result= WaitForMultipleObjects(2, cond- events, FALSE, timeout);
此處是等待時間,何處進行事件通知呢?我們再次來到上篇所提及的為新的連接創(chuàng)建線程的代碼中:
pthread_cond_signal(COND_thread_cache);
看完上述內容,你們對 Mysql 中 Thread Manager 的作用是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。