|
|
多线程的一大优点就是资源共享,可以很方便的进行通信,但当对共享资源操作时,有时还需要锁操作。
为了既保证共享资源又增加系统并发量,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);
|
|
|