单线程

使用单线程顺序执行任务

72726678ac6604116c1d5dad160780bc.png

事件循环机制

为了在线程运行过程中,能接收并执行新的任务,引入事件循环机制(在循环语句中如果有新事件发生则触发运行)

  1. //GetInput
  2. //等待用户从键盘输入一个数字,并返回该输入的数字
  3. int GetInput(){
  4. int input_number = 0;
  5. cout<<"请输入一个数:";
  6. cin>>input_number;
  7. return input_number;
  8. }
  9. //主线程(Main Thread)
  10. void MainThread(){
  11. for(;;){
  12. int first_num = GetInput();
  13. int second_num = GetInput();
  14. result_num = first_num + second_num;
  15. print("最终计算的值为:%d",result_num);
  16. }
  17. }

9e0f595324fbd5b7cd1c1ae1140f7de3.png

消息队列

为处理其他线程发送过来的任务,引入消息队列

  1. IO 线程将产生的新任务添加到消息队列中
  2. 渲染主线程循环获取消息队列头部中的任务

2ac6bc0361cb4690c5cc83d8abad22ab.png

IO 线程

处理跨进程的任务:进程间的通信 IPC 来实现,通过 IO 线程来接收这些任务

e2582e980632fd2df5043f81a11461c6.png

微任务

为了处理新产生的高优先级的任务(解决实时性问题),引入微任务 消息队列中的任务称为宏任务,每个宏任务中都包含了一个微任务队列

setTimeout

为了支持定时器,引入延时队列

  1. void ProcessTimerTask(){
  2. //从delayed_incoming_queue中取出已经到期的定时器任务
  3. //依次执行这些任务
  4. }
  5. TaskQueue task_queue
  6. void ProcessTask();
  7. bool keep_running = true;
  8. void MainTherad(){
  9. for(;;){
  10. //执行消息队列中的任务
  11. Task task = task_queue.takeTask();
  12. ProcessTask(task);
  13. //执行延迟队列中的任务
  14. ProcessDelayTask()
  15. if(!keep_running) //如果设置了退出标志,那么直接退出线程循环
  16. break;
  17. }
  18. }
  • 处理完消息队列中的任务后,才执行延迟队列的任务

    参考资料

  1. 浏览器工作原理与实践