您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  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  
察察 工商 网安 举报有奖  警警  手机打开网站