1.C++的线程分类
举例:假如你要烧水,然后去拉屎,准备杯子,烧水喂老婆喝水,老婆高兴了让你打lol(假设烧水20分钟。拉屎10分钟,杯子5分钟,老婆见不到你的忍耐时间为25分钟)
- 同步阻塞(你只盯着水壶的火,烧开才走,再去拉屎,准备杯子,给老婆倒水)-老婆等了35分钟-生气
- 异步阻塞(水没有烧好,但是你先拉屎,拉完干等水烧好,水烧好准备杯子)-老婆等了25分钟-勉强高兴
- 同步非阻塞(水没有烧好,不等水烧好便准备杯子,看了15分钟直播,烧开,拉屎,喂老婆)-老婆等了30分钟,你看了15分钟比赛-老婆有点生气,但是你也没有亏太多
- 异步非阻塞(你先烧水放那,然后直接陪老婆,陪老婆的时候准备杯子,水好了拿着杯子倒水,再喂老婆,然后自己去拉屎) -老婆等了0分钟,决定晚上好好奖励你
2.一些优化点
- std::async在多级子函数中调用一定会阻塞,除非你层层的返回furture对象。
- 真正多级子函数异步非阻塞还得创建线程对象。
3.例子
#include <future>
using namespace std;
#include <thread>
#include <chrono>
#include <iostream>
std::chrono::seconds operator"" _s( unsigned long long t ) ;
inline void sleep_ms(int t){
std::this_thread::sleep_for( std::chrono::milliseconds(t) ) ;
}
inline void sleep_s(int t){
std::this_thread::sleep_for( std::chrono::seconds(t) ) ;
}
void test(){
int index1 = 0;
while (index1<10){
std::cout<<"index1:"<<index1<<std::endl;
sleep_s(1);
index1++;
}
}
int main()
{
auto t = std::async(std::launch::async,test);
int index = 0;
while (index<100){
std::cout<<"index:"<<index<<std::endl;
sleep_ms(500);
index++;
}
t.get();
return 0;
}
输出
index:0
index1:0
index:1
index1:1
index:2
index:3
index1:2
index:4
index:5
index1:3
index:6
index:7
index1:4
index:8
index:9
index1:5
index:10
index:11
index1:6
index:12
index:13
index1:7
index:14
index:15
index1:8
index:16
index:17
index1:9
index:18
index:19
2.协程
协程是什么鬼?就是你一边打游戏一边陪女朋友。你自己顾此失彼,协程就相当于你顺风的时候托管,然后你去陪女朋友,逆风的时候王者的你自己操作,女朋友就先等着。
协程相当于微线程,基于线程上创建的一种调度机制。
2.1应用场景
高并发服务,如秒杀系统、高性能API接口、RPC服务器,使用协程模式,服务的容错率会大大增加,某些接口出现故障时,不会导致整个服务崩溃。
爬虫,可实现非常巨大的并发能力,即使是非常慢速的网络环境,也可以高效地利用带宽。
即时通信服务,如IM聊天、游戏服务器、物联网、消息服务器等等,可以确保消息通信完全无阻塞,每个消息包均可即时地被处理。
2.2其他描述
协程会阻塞当前线程。
协程类似于生产者消费者模式,一个任务负责生产,另一个负责获取。
2.3通讯方式
协程通过协程管道传递信息。C++的机制一般是promise。
2.4案例