時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
MySQL數(shù)據(jù)庫(kù)創(chuàng)建線程的相關(guān)操作是本文我們主要要介紹的內(nèi)容,MySQL數(shù)據(jù)庫(kù)中,為了提高系統(tǒng)效率,減少頻繁創(chuàng)建線程和中止線程的系統(tǒng)消耗,MySQL使用了線程緩沖區(qū)的概念,即如果一個(gè)連接斷開(kāi),則并不銷(xiāo)毀承載其的線程,而是將此線程放入線程緩沖區(qū),并處于掛起狀態(tài),當(dāng)下一個(gè)新的Connection到來(lái)時(shí),首先去線程緩沖區(qū)去查找是否有空閑的線程,如果有,則使用之,如果沒(méi)有則新建線程。
1.線程創(chuàng)建函數(shù)
大家知道,Mysql現(xiàn)在是插件式的存儲(chǔ)引擎,只要實(shí)現(xiàn)規(guī)定的接口,就可實(shí)現(xiàn)自己的存儲(chǔ)引擎。故Mysql的線程創(chuàng)建除了出現(xiàn)在主服務(wù)器框架外,存儲(chǔ)引擎也可能會(huì)進(jìn)行線程的創(chuàng)建。通過(guò)設(shè)置斷點(diǎn),在我調(diào)試的版本中,發(fā)現(xiàn)了兩個(gè)創(chuàng)建線程的函數(shù)。
pthread_create:Mysql自用的創(chuàng)建線程函數(shù)
os_thread_create:存儲(chǔ)引擎innobase的創(chuàng)建線程的函數(shù)
os_thread_create是存儲(chǔ)引擎innobase的線程函數(shù),先擱淺不研究了,重點(diǎn)看下pthread_create,首先看下其源碼。
- int?pthread_create(pthread_t?*thread_id,?pthread_attr_t?*attr, ?
- pthread_handler?func,?void?*param) ?
- { ?
- HANDLE?hThread; ?
- struct?pthread_map?*map; ?
- DBUG_ENTER("pthread_create"); ?
- if?(!(map=malloc(sizeof(*map)))) ?
- DBUG_RETURN(-1); ?
- map->funcfunc=func;?map->paramparam=param; ?
- pthread_mutex_lock(&THR_LOCK_thread); ?
- #ifdef?__BORLANDC__ ?
- hThread=(HANDLE)_beginthread((void(_USERENTRY?*)(void?*))?pthread_start, ?
- attr->dwStackSize???attr->dwStackSize?: ?
- 65535,?(void*)?map); ?
- #else ?
- hThread=(HANDLE)_beginthread((void(?__cdecl?*)(void?*))?pthread_start,?attr->dwStackSize???attr->dwStackSize?:?65535,?(void*)?map); ?
- #endif ?
- DBUG_PRINT("info",?("hThread=%lu",(long)?hThread)); ?
- *thread_id=map->pthreadself=hThread; ?
- pthread_mutex_unlock(&THR_LOCK_thread); ?
- if?(hThread?==?(HANDLE)?-1) ?
- { ?
- int?error=errno; ?
- DBUG_PRINT("error", ?
- ("Can't?create?thread?to?handle?request?(error?%d)",error)); ?
- DBUG_RETURN(error???error?:?-1); ?
- } ?
- VOID(SetThreadPriority(hThread,?attr->priority))?; ?
- DBUG_RETURN(0); ?
- }?
上面代碼首先構(gòu)造了一個(gè)map結(jié)構(gòu)體,成員分別是函數(shù)地址和傳入?yún)?shù)。然后調(diào)用操作系統(tǒng)的接口,_beginthread,但是執(zhí)行函數(shù)并不是傳入的函數(shù)——func,而是pthread_start,參數(shù)為map。繼續(xù)跟蹤pthread_start。
- pthread_handler_t?pthread_start(void?*param) ?
- { ?
- pthread_handler ?
- func=((struct?pthread_map?*)?param)->func ?
- void?*func_param=((struct?pthread_map?*)?param)->param; ?
- my_thread_init();???/*?Will?always?succeed?in?windows?*/ ?
- pthread_mutex_lock(&THR_LOCK_thread);???/*?Wait?for?beginthread?to?return?*/ ?
- win_pthread_self=((struct?pthread_map?*)?param)->pthreadself; ?
- pthread_mutex_unlock(&THR_LOCK_thread); ?
- free((char*)?param);/*?Free?param?from?create?*/ ?
- pthread_exit((void*)?(*func)(func_param)); ?
- return?0;???/*?Safety?*/ ?
- }?
可以看出,pthread_start中調(diào)用了map的func元素,作為真正執(zhí)行的函數(shù)體。OK,創(chuàng)建線程的函數(shù)跟蹤到此!
2.服務(wù)器啟動(dòng)時(shí)創(chuàng)建了哪些函數(shù)?
通過(guò)在兩個(gè)創(chuàng)建線程的地方設(shè)置斷點(diǎn),總結(jié)了下,在服務(wù)器啟動(dòng)時(shí),創(chuàng)建了如下的線程。
pthread_create創(chuàng)建的線程:
創(chuàng)建線程函數(shù) | 線程執(zhí)行函數(shù) |
create_shutdown_thread | handle_shutdown |
start_handle_manager | handle_manager |
handle_connections_method 關(guān)鍵詞標(biāo)簽:MySQL,數(shù)據(jù)庫(kù) 相關(guān)閱讀
熱門(mén)文章 Xbox Game Pass 10款MySQL數(shù)據(jù)庫(kù)客戶(hù)端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) 相關(guān)下載 人氣排行 10款MySQL數(shù)據(jù)庫(kù)客戶(hù)端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯(cuò)誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實(shí)際操作步驟匯總 MySQL無(wú)法啟動(dòng)、無(wú)法停止各種解決方法總結(jié) 三種常用的MySQL建表語(yǔ)句
|