1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit). 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Use of this source code is governed by MIT license that can be found in the 7*4882a593Smuzhiyun * LICENSE file in the root of the source tree. All contributing project authors 8*4882a593Smuzhiyun * may be found in the AUTHORS file in the root of the source tree. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef MK_THREAD_H 12*4882a593Smuzhiyun #define MK_THREAD_H 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <assert.h> 15*4882a593Smuzhiyun #include "mk_common.h" 16*4882a593Smuzhiyun #include "mk_tcp.h" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifdef __cplusplus 19*4882a593Smuzhiyun extern "C" { 20*4882a593Smuzhiyun #endif 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun ///////////////////////////////////////////事件线程///////////////////////////////////////////// 23*4882a593Smuzhiyun typedef void* mk_thread; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /** 26*4882a593Smuzhiyun * 获取tcp会话对象所在事件线程 27*4882a593Smuzhiyun * @param ctx tcp会话对象 28*4882a593Smuzhiyun * @return 对象所在事件线程 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun API_EXPORT mk_thread API_CALL mk_thread_from_tcp_session(mk_tcp_session ctx); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /** 33*4882a593Smuzhiyun * 获取tcp客户端对象所在事件线程 34*4882a593Smuzhiyun * @param ctx tcp客户端 35*4882a593Smuzhiyun * @return 对象所在事件线程 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun API_EXPORT mk_thread API_CALL mk_thread_from_tcp_client(mk_tcp_client ctx); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /** 40*4882a593Smuzhiyun * 根据负载均衡算法,从事件线程池中随机获取一个事件线程 41*4882a593Smuzhiyun * 如果在事件线程内执行此函数将返回本事件线程 42*4882a593Smuzhiyun * 事件线程指的是定时器、网络io事件线程 43*4882a593Smuzhiyun * @return 事件线程 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun API_EXPORT mk_thread API_CALL mk_thread_from_pool(); 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /** 48*4882a593Smuzhiyun * 根据负载均衡算法,从后台线程池中随机获取一个线程 49*4882a593Smuzhiyun * 后台线程本质与事件线程相同,只是优先级更低,同时可以执行短时间的阻塞任务 50*4882a593Smuzhiyun * ZLMediaKit中后台线程用于dns解析、mp4点播时的文件解复用 51*4882a593Smuzhiyun * @return 后台线程 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun API_EXPORT mk_thread API_CALL mk_thread_from_pool_work(); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun typedef void* mk_thread_pool; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /** 58*4882a593Smuzhiyun * 创建线程池 59*4882a593Smuzhiyun * @param name 线程池名称,方便调试 60*4882a593Smuzhiyun * @param n_thread 线程个数,0时为cpu个数 61*4882a593Smuzhiyun * @param priority 线程优先级,分为PRIORITY_LOWEST = 0,PRIORITY_LOW, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_HIGHEST 62*4882a593Smuzhiyun * @return 线程池 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun API_EXPORT mk_thread_pool API_CALL mk_thread_pool_create(const char *name, size_t n_thread, int priority); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /** 67*4882a593Smuzhiyun * 销毁线程池 68*4882a593Smuzhiyun * @param pool 线程池 69*4882a593Smuzhiyun * @return 0:成功 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun API_EXPORT int API_CALL mk_thread_pool_release(mk_thread_pool pool); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /** 74*4882a593Smuzhiyun * 从线程池获取一个线程 75*4882a593Smuzhiyun * @param pool 线程池 76*4882a593Smuzhiyun * @return 线程 77*4882a593Smuzhiyun */ 78*4882a593Smuzhiyun API_EXPORT mk_thread API_CALL mk_thread_from_thread_pool(mk_thread_pool pool); 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun ///////////////////////////////////////////线程切换///////////////////////////////////////////// 81*4882a593Smuzhiyun typedef void (API_CALL *on_mk_async)(void *user_data); 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /** 84*4882a593Smuzhiyun * 切换到事件线程并异步执行 85*4882a593Smuzhiyun * @param ctx 事件线程 86*4882a593Smuzhiyun * @param cb 回调函数 87*4882a593Smuzhiyun * @param user_data 用户数据指针 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun API_EXPORT void API_CALL mk_async_do(mk_thread ctx, on_mk_async cb, void *user_data); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /** 92*4882a593Smuzhiyun * 切换到事件线程并延时执行 93*4882a593Smuzhiyun * @param ctx 事件线程 94*4882a593Smuzhiyun * @param ms 延时时间,单位毫秒 95*4882a593Smuzhiyun * @param cb 回调函数 96*4882a593Smuzhiyun * @param user_data 用户数据指针 97*4882a593Smuzhiyun */ 98*4882a593Smuzhiyun API_EXPORT void API_CALL mk_async_do_delay(mk_thread ctx, size_t ms, on_mk_async cb, void *user_data); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /** 101*4882a593Smuzhiyun * 切换到事件线程并同步执行 102*4882a593Smuzhiyun * @param ctx 事件线程 103*4882a593Smuzhiyun * @param cb 回调函数 104*4882a593Smuzhiyun * @param user_data 用户数据指针 105*4882a593Smuzhiyun */ 106*4882a593Smuzhiyun API_EXPORT void API_CALL mk_sync_do(mk_thread ctx, on_mk_async cb, void *user_data); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun ///////////////////////////////////////////定时器///////////////////////////////////////////// 109*4882a593Smuzhiyun typedef void* mk_timer; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /** 112*4882a593Smuzhiyun * 定时器触发事件 113*4882a593Smuzhiyun * @return 下一次触发延时(单位毫秒),返回0则不再重复 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun typedef uint64_t (API_CALL *on_mk_timer)(void *user_data); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /** 118*4882a593Smuzhiyun * 创建定时器 119*4882a593Smuzhiyun * @param ctx 线程对象 120*4882a593Smuzhiyun * @param delay_ms 执行延时,单位毫秒 121*4882a593Smuzhiyun * @param cb 回调函数 122*4882a593Smuzhiyun * @param user_data 用户数据指针 123*4882a593Smuzhiyun * @return 定时器对象 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun API_EXPORT mk_timer API_CALL mk_timer_create(mk_thread ctx, uint64_t delay_ms, on_mk_timer cb, void *user_data); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /** 128*4882a593Smuzhiyun * 销毁和取消定时器 129*4882a593Smuzhiyun * @param ctx 定时器对象 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun API_EXPORT void API_CALL mk_timer_release(mk_timer ctx); 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun ///////////////////////////////////////////信号量///////////////////////////////////////////// 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun typedef void* mk_sem; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /** 138*4882a593Smuzhiyun * 创建信号量 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun API_EXPORT mk_sem API_CALL mk_sem_create(); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /** 143*4882a593Smuzhiyun * 销毁信号量 144*4882a593Smuzhiyun */ 145*4882a593Smuzhiyun API_EXPORT void API_CALL mk_sem_release(mk_sem sem); 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /** 148*4882a593Smuzhiyun * 信号量加n 149*4882a593Smuzhiyun */ 150*4882a593Smuzhiyun API_EXPORT void API_CALL mk_sem_post(mk_sem sem, size_t n); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /** 153*4882a593Smuzhiyun * 信号量减1 154*4882a593Smuzhiyun * @param sem 155*4882a593Smuzhiyun */ 156*4882a593Smuzhiyun API_EXPORT void API_CALL mk_sem_wait(mk_sem sem); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #ifdef __cplusplus 159*4882a593Smuzhiyun } 160*4882a593Smuzhiyun #endif 161*4882a593Smuzhiyun #endif //MK_THREAD_H 162