亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

MySQL創建線程的方法

添加時間:2012-6-25  添加: admin 

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

1.線程創建函數

大家知道,Mysql現在是插件式的存儲引擎,只要實現規定的接口,就可實現自己的存儲引擎。故Mysql的線程創建除了出現在主服務器框架外,存儲引擎也可能會進行線程的創建。通過設置斷點,在我調試的版本中,發現了兩個創建線程的函數。

pthread_create:Mysql自用的創建線程函數

os_thread_create:存儲引擎innobase的創建線程的函數

os_thread_create是存儲引擎innobase的線程函數,先擱淺不研究了,重點看下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);  } 上面代碼首先構造了一個map結構體,成員分別是函數地址和傳入參數。然后調用操作系統的接口,_beginthread,但是執行函數并不是傳入的函數——func,而是pthread_start,參數為map。繼續跟蹤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中調用了map的func元素,作為真正執行的函數體。OK,創建線程的函數跟蹤到此!

2.服務器啟動時創建了哪些函數?

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

pthread_create創建的線程:

創建線程函數 線程執行函數
create_shutdown_thread
 handle_shutdown
 
start_handle_manager
 handle_manager
 
handle_connections_methods
 handle_connections_sockets
 


innobase的os_thread_create創建的線程:

創建線程函數 線程執行函數
innobase_start_or_create_for_mysql
 io_handler_thread(4個)
 
recv_recovery_from_checkpoint_finish
 trx_rollback_or_clean_all_without_sess
 
innobase_start_or_create_for_mysql
 srv_lock_timeout_thread
 
  srv_error_monitor_thread
 
  srv_monitor_thread
 
  srv_master_thread
 


還可以在調試過程中,通過暫停來看此時服務器中的線程,如下圖:MySQL數據庫創建線程的相關操作詳解

關鍵字:MySQL、創建線程、方法

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站