标签搜索

skynet的启动和线程分类

anker
2021-06-28 / 0 评论 / 63 阅读 / 正在检测是否收录...

启动时主线程初始化定制的lua.

void skynet_start(struct skynet_config * config) {
    // register SIGHUP for log file reopen
    struct sigaction sa;
    sa.sa_handler = &handle_hup;
    sa.sa_flags = SA_RESTART;
    sigfillset(&sa.sa_mask);
    sigaction(SIGHUP, &sa, NULL);

    if (config->daemon) {
        if (daemon_init(config->daemon)) {
            exit(1);
        }
    }
    skynet_harbor_init(config->harbor);
    skynet_handle_init(config->harbor);
    skynet_mq_init();
    skynet_module_init(config->module_path);
    skynet_timer_init();
    skynet_socket_init();
    skynet_profile_enable(config->profile);

    struct skynet_context *ctx = skynet_context_new(config->logservice, config->logger);
    if (ctx == NULL) {
        fprintf(stderr, "Can't launch %s service\n", config->logservice);
        exit(1);
    }

    bootstrap(ctx, config->bootstrap);

    start(config->thread);

    // harbor_exit may call socket send, so it should exit before socket_free
    skynet_harbor_exit();
    skynet_socket_free();
    if (config->daemon) {
        daemon_exit(config->daemon);
    }
}
#0  snlua_init at service-src/service_snlua.c:148
#1  skynet_context_new (name="snlua", param="bootstrap")  at skynet-src/skynet_server.c:161
#2  bootstrap (cmdline= "snlua bootstrap") at skynet-src/skynet_start.c:238
#3  skynet_start at skynet-src/skynet_start.c:274
#4  main  at skynet-src/skynet_main.c:163
struct skynet_context *
skynet_context_new(const char * name, const char *param) {
    struct skynet_module * mod = skynet_module_query(name); // 查询对应的.so是否加载起来了

    if (mod == NULL)
        return NULL;

    void *inst = skynet_module_instance_create(mod);
    if (inst == NULL)
        return NULL;
    struct skynet_context * ctx = skynet_malloc(sizeof(*ctx));
    CHECKCALLING_INIT(ctx)
    ...
    ...
    ...
    struct message_queue * queue = ctx->queue = skynet_mq_create(ctx->handle);
    ...
    ...
    int r = skynet_module_instance_init(mod, inst, ctx, param);// 调用对应的${mode_name}_init
    if (r == 0) {
        struct skynet_context * ret = skynet_context_release(ctx);
        if (ret) {
            ctx->init = true;
        }
        skynet_globalmq_push(queue); // 每个skynet_context都有自己的消息队列
        if (ret) {
            skynet_error(ret, "LAUNCH %s %s", name, param ? param : "");
        }
        return ret;
    } else
    ...
}

虽然配置文件指定8个工作线程,但是实际上,加上主线程+监控线程+定时器线程+socket处理线程,共运行12个线程。
主线程在启动其他线程后进入了等待其他线程结束。

(gdb) info threads
  Id   Target Id         Frame
  12   Thread 0x7faad9f7b700 (LWP 12989) "skynet" 0x00007faadb6401ad in nanosleep () from /lib64/libc.so.6
  11   Thread 0x7faad977a700 (LWP 12990) "skynet" 0x00007faadb6401ad in nanosleep () from /lib64/libc.so.6
  10   Thread 0x7faad8f79700 (LWP 12991) "skynet" 0x00007faadb679923 in epoll_wait () from /lib64/libc.so.6
  9    Thread 0x7faad8778700 (LWP 12992) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  8    Thread 0x7faad7f77700 (LWP 12993) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  7    Thread 0x7faad7776700 (LWP 12994) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  6    Thread 0x7faad6f75700 (LWP 12995) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  5    Thread 0x7faad6774700 (LWP 12996) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  4    Thread 0x7faad5f73700 (LWP 12997) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  3    Thread 0x7faad5772700 (LWP 12998) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  2    Thread 0x7faad4f71700 (LWP 12999) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
* 1    Thread 0x7faadc47ff00 (LWP 12988) "skynet" 0x00007faadc05af57 in pthread_join () from /lib64/libpthread.so.0

主线程调用:

#1  in start (thread=8) at skynet-src/skynet_start.c:226
#2  skynet_start at skynet-src/skynet_start.c:276
#3  main  at skynet-src/skynet_main.c:163
socket处理线程
#0  in epoll_wait () from /lib64/libc.so.6
#1  in sp_wait at skynet-src/socket_epoll.h:55
#2  socket_server_poll at skynet-src/socket_server.c:1369
#3  skynet_socket_poll at skynet-src/skynet_socket.c:79
#4  thread_socket at skynet-src/skynet_start.c:68
#5  start_thread () from /lib64/libpthread.so.0
#6  clone () from /lib64/libc.so.6

定时器线程

#0  nanosleep () from /lib64/libc.so.6
#1  usleep () from /lib64/libc.so.6
#2  thread_timer (p=0x7faadb1ce180) at skynet-src/skynet_start.c:136
#3  start_thread () from /lib64/libpthread.so.0
#4  clone () from /lib64/libc.so.6

监控线程

#0  nanosleep () from /lib64/libc.so.6
#1  sleep () from /lib64/libc.so.6
#2  thread_monitor (p=0x7faadb1ce180) at skynet-src/skynet_start.c:106
#3  start_thread () from /lib64/libpthread.so.0
#4  clone () from /lib64/libc.so.6

8个工作线程

#0  pthread_cond_wait() from /lib64/libpthread.so.0
#1  thread_worker  at skynet-src/skynet_start.c:169
#2  start_thread from /lib64/libpthread.so.0
#3  clone () from /lib64/libc.so.6
0

评论 (0)

取消