MySQL 笔记(多线程)

多线程的一大优点就是资源共享,可以很方便的进行通信,但当对共享资源操作时,有时还需要锁操作。

为了既保证共享资源又增加系统并发量,MySQL使用了很多函数库来代替标准库函数(在mysys文件夹下面定义)

而对于锁的处理,MySQL按照相关性将将全局资源和变量分组,以组为单位进行加锁

全局锁以LOCK_开头,在mysql_priv.h文件中定义

线程锁以THR_LOCK_开头,在my_thr_init.c中定义

线程同步使用条件变量来实现,以COND_开头,与锁结合使用。

 

启动服务器

服务器启动代码在sql/mysqld.cc中实现。

#ifdef __WIN__
int win_main(int argc, char **argv)
#else
int main(int argc, char **argv)
#endif
……
 
mysqld调用的主要函数如下:
 
MY_INIT(argv[0]); //初始化线程和mysql库函数,调用my_init()函数

logger.init_base(); //初始化日志类
 
/*初始化全局变量,给mysql设置默认参数*/
  if (init_common_variables(MYSQL_CONFIG_NAME,
			    argc, argv, load_default_groups))
    unireg_abort(1);	

init_signals(); //初始化各种同步信号
pthread_attr_setstacksize(&connection_attrib,my_thread_stack_size*2);//设置线程栈,my_thread_stack_size默认大小为65536
。。。。。。
/*检查用户*/
  if ((user_info= check_user(mysqld_user)))
  {
#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT)
    if (locked_in_memory) // getuid() == 0 here
      set_effective_user(user_info);
    else
#endif
      set_user(mysqld_user, user_info);
  }

  if (init_server_components())  //初始化服务器模块
    unireg_abort(1);

  network_init();//初始化网络子系统
 acl_init(opt_noacl);//初始化ACL
   

   create_shutdown_thread();  //创建关闭线程
   start_handle_manager();   


  handle_connections_sockets(0);  //服务处理函数,等待接受命令
  
/*最后要进行清理以及等待线程结束*/
  clean_up(1);
  wait_for_signal_thread_to_end();
  clean_up_mutexes();
  my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);

  exit(0);
 
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值