Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

162 rindas
4.4KB

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