MySQL一个线程处理一个连接源码

MySQL新到来一个连接后,会为该线程分配一个线程。如果服务器已经有空闲的线程被缓存了,则直接使用。如果没有缓存可用的线程,则重新创建一个线程给该连接使用。

/*

  Scheduler that uses one thread per connection

*/

 

void create_thread_to_handle_connection(THD *thd)

{

  if (cached_thread_count > wake_thread)//判断时候有缓存线程

  {

    /* Get thread from cache */

    thread_cache.append(thd);//如果有缓存线程,则将该连接信息交给该线程处理

    wake_thread++;

    mysql_cond_signal(&COND_thread_cache);//激活被缓存的线程开始处理连接信息

  }

  Else//进入Else,表示没有可用的缓存线程了

  {

    char error_message_buff[MYSQL_ERRMSG_SIZE];

    /* Create new thread to handle connection */

    int error;

    thread_created++;//创建新线程,线程数+1,

    threads.append(thd);

    DBUG_PRINT("info",(("creating thread %lu"), thd->thread_id));

    thd->prior_thr_create_utime= thd->start_utime= my_micro_time();

    if ((error= mysql_thread_create(key_thread_one_connection,

                                    &thd->real_id, &connection_attrib,

                                    handle_one_connection,

                                    (void*) thd)))//创建线程

    {

      /* purecov: begin inspected */

      DBUG_PRINT("error",

                 ("Can't create thread to handle request (error %d)",

                  error));

      thread_count--;//创建失败,则执行-1操作

      thd->killed= THD::KILL_CONNECTION;         // Safety

      mysql_mutex_unlock(&LOCK_thread_count);

 

      mysql_mutex_lock(&LOCK_connection_count);

      --connection_count;//到此,表示该连接没有被线程处理

      mysql_mutex_unlock(&LOCK_connection_count);

 

      statistic_increment(aborted_connects,&LOCK_status);

      /* Can't use my_error() since store_globals has not been called. */

      my_snprintf(error_message_buff, sizeof(error_message_buff),//写错误日志

                  ER_THD(thd, ER_CANT_CREATE_THREAD), error);

      net_send_error(thd, ER_CANT_CREATE_THREAD, error_message_buff, NULL);//向客户端发生错误信息

      close_connection(thd);//结束该连接

      mysql_mutex_lock(&LOCK_thread_count);

      delete thd;//删除未该连接分配的资源

      mysql_mutex_unlock(&LOCK_thread_count);

      return;

      /* purecov: end */

    }

  }

  mysql_mutex_unlock(&LOCK_thread_count);

  DBUG_PRINT("info",("Thread created"));//线程创建成功

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值