IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉貼|軟件發(fā)布

您當前所在位置: 首頁數(shù)據(jù)庫MYSQL → MySQL數(shù)據(jù)庫創(chuàng)建線程

MySQL數(shù)據(jù)庫創(chuàng)建線程

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

MySQL數(shù)據(jù)庫創(chuàng)建線程的相關操作是本文我們主要要介紹的內容,MySQL數(shù)據(jù)庫中,為了提高系統(tǒng)效率,減少頻繁創(chuàng)建線程和中止線程的系統(tǒng)消耗,MySQL使用了線程緩沖區(qū)的概念,即如果一個連接斷開,則并不銷毀承載其的線程,而是將此線程放入線程緩沖區(qū),并處于掛起狀態(tài),當下一個新的Connection到來時,首先去線程緩沖區(qū)去查找是否有空閑的線程,如果有,則使用之,如果沒有則新建線程。

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ù)。

pthread_create:Mysql自用的創(chuàng)建線程函數(shù)

os_thread_create:存儲引擎innobase的創(chuàng)建線程的函數(shù)

os_thread_create是存儲引擎innobase的線程函數(shù),先擱淺不研究了,重點看下pthread_create,首先看下其源碼。

  1. int?pthread_create(pthread_t?*thread_id,?pthread_attr_t?*attr, ?
  2. pthread_handler?func,?void?*param) ?
  3. { ?
  4. HANDLE?hThread; ?
  5. struct?pthread_map?*map; ?
  6. DBUG_ENTER("pthread_create"); ?
  7. if?(!(map=malloc(sizeof(*map)))) ?
  8. DBUG_RETURN(-1); ?
  9. map->funcfunc=func;?map->paramparam=param; ?
  10. pthread_mutex_lock(&THR_LOCK_thread); ?
  11. #ifdef?__BORLANDC__ ?
  12. hThread=(HANDLE)_beginthread((void(_USERENTRY?*)(void?*))?pthread_start, ?
  13. attr->dwStackSize???attr->dwStackSize?: ?
  14. 65535,?(void*)?map); ?
  15. #else ?
  16. hThread=(HANDLE)_beginthread((void(?__cdecl?*)(void?*))?pthread_start,?attr->dwStackSize???attr->dwStackSize?:?65535,?(void*)?map); ?
  17. #endif ?
  18. DBUG_PRINT("info",?("hThread=%lu",(long)?hThread)); ?
  19. *thread_id=map->pthreadself=hThread; ?
  20. pthread_mutex_unlock(&THR_LOCK_thread); ?
  21. if?(hThread?==?(HANDLE)?-1) ?
  22. { ?
  23. int?error=errno; ?
  24. DBUG_PRINT("error", ?
  25. ("Can't?create?thread?to?handle?request?(error?%d)",error)); ?
  26. DBUG_RETURN(error???error?:?-1); ?
  27. } ?
  28. VOID(SetThreadPriority(hThread,?attr->priority))?; ?
  29. DBUG_RETURN(0); ?
  30. }?

上面代碼首先構造了一個map結構體,成員分別是函數(shù)地址和傳入?yún)?shù)。然后調用操作系統(tǒng)的接口,_beginthread,但是執(zhí)行函數(shù)并不是傳入的函數(shù)——func,而是pthread_start,參數(shù)為map。繼續(xù)跟蹤pthread_start。

  1. pthread_handler_t?pthread_start(void?*param) ?
  2. { ?
  3. pthread_handler ?
  4. func=((struct?pthread_map?*)?param)->func ?
  5. void?*func_param=((struct?pthread_map?*)?param)->param; ?
  6. my_thread_init();???/*?Will?always?succeed?in?windows?*/ ?
  7. pthread_mutex_lock(&THR_LOCK_thread);???/*?Wait?for?beginthread?to?return?*/ ?
  8. win_pthread_self=((struct?pthread_map?*)?param)->pthreadself; ?
  9. pthread_mutex_unlock(&THR_LOCK_thread); ?
  10. free((char*)?param);/*?Free?param?from?create?*/ ?
  11. pthread_exit((void*)?(*func)(func_param)); ?
  12. return?0;???/*?Safety?*/ ?
  13. }?

可以看出,pthread_start中調用了map的func元素,作為真正執(zhí)行的函數(shù)體。OK,創(chuàng)建線程的函數(shù)跟蹤到此!

2.服務器啟動時創(chuàng)建了哪些函數(shù)?

通過在兩個創(chuàng)建線程的地方設置斷點,總結了下,在服務器啟動時,創(chuàng)建了如下的線程。

pthread_create創(chuàng)建的線程:

    • 創(chuàng)建線程函數(shù)線程執(zhí)行函數(shù)

      create_shutdown_thread

      handle_shutdown

      start_handle_manager

      handle_manager

      handle_connections_method

      關鍵詞標簽:MySQL,數(shù)據(jù)庫

      相關閱讀

      文章評論
      發(fā)表評論

      熱門文章 Xbox Game Pass Xbox Game Pass 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL常用維護管理工具 MySQL常用維護管理工具 MySQL數(shù)據(jù)庫啟動失敗1067進程意外終止的解決辦法總結 MySQL數(shù)據(jù)庫啟動失敗1067進程意外終止的解決辦法總結

      相關下載

        人氣排行 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫啟動失敗1067進程意外終止的解決辦法總結 Mysql 1045錯誤解決辦法 MySQL服務器進程CPU占用100%解決辦法 MySQL導出導入命令的用例 MySQL連接字符串的實際操作步驟匯總 MySQL無法啟動、無法停止各種解決方法總結 三種常用的MySQL建表語句