您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Mysql中Thread Manager的作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1.線程創建函數
大家知道,Mysql現在是插件式的存儲引擎,只要實現規定的接口,就可實現自己的存儲引擎。故Mysql的線程創建除了
出現在主服務器框架外,存儲引擎也可能會進行線程的創建。通過設置斷點,在我調試的版本中,發現了兩個創建線程的函數。
os_thread_create是存儲引擎innobase的線程函數,先擱淺不研究了,重點看下pthread_create,首先看下其源碼。
map->func=func; map->param=param;
hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start, attr->dwStackSize ? attr->dwStackSize : 65535, (void*) map);
上面代碼首先構造了一個map結構體,成員分別是函數地址和傳入參數。然后調用操作系統的接口,_beginthread,但是執行函數并不是傳入的函數——func,而是pthread_start,參數為map。繼續跟蹤pthread_start。
func=((struct pthread_map *) param)->func
可以看出,pthread_start中調用了map的func元素,作為真正執行的函數體。OK,創建線程的函數跟蹤到此!
2.服務器啟動時創建了哪些函數?
通過在兩個創建線程的地方設置斷點,總結了下,在服務器啟動時,創建了如下的線程。
pthread_create創建的線程:
innobase的os_thread_create創建的線程:
還可以在調試過程中,通過暫停來看此時服務器中的線程,如下圖:
三、線程緩沖池
Mysql支持線程緩存,在多線程連接模式下,如果連接斷開后,將這個線程放入空閑線程緩沖區,在下次有連接到來時,
先去緩沖池中查找是否有空閑線程,有則用之,無則創建。啟動時可以設置線程緩沖池的數目:
在一個連接斷開時,會調用cache_thread函數,將空閑的線程加入到cache中,以備后用。如下:
cached_thread_count < thread_cache_size
pthread_cond_signal(&COND_flush_thread_cache);
上面我們的啟動參數設置線程緩沖區為10,此時對應代碼里面的thread_cache_size = 10,cached_thread_count記錄
了此刻cache中的空閑線程數目,只有在cache未滿的情況下,才會將新的空閑線程加入緩沖池中。加入到緩沖區其實就是將線
程掛起,pthread_cond_wait函數便是線程等待函數,在此函數中,會調用WaitForMultipleObjects進行事件等待。具體源碼
如下:
result= WaitForMultipleObjects(2, cond->events, FALSE, timeout);
此處是等待時間,何處進行事件通知呢?我們再次來到上篇所提及的為新的連接創建線程的代碼中:
pthread_cond_signal(&COND_thread_cache);
看完上述內容,你們對Mysql中Thread Manager的作用是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。