一、 一 概念
1. 同步:调用时,在没有得到结果之前,该调用就不返回,按照这个定义,绝大多数函数都是同步调用。一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
最常见的例子就是 SendMessage。
2. 异步:调用者不会立刻得到结果,调用发出后,通过状态(效率低)、通知,或回调函数来通知调用者。PostMessgae。
3. 同步异步的区别:如何通知调用者得到调用结果,同步等待调用完成,异步通过状态、通知,或回调函数。
4. 阻塞:调用结果返回之前,当前线程会被挂起。socket的read/write/recv
5. 同步与阻塞的区别:同步当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
6. 非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
7. 异步与非阻塞的区别:非阻塞是立刻返回调用结果,异步不会立刻返回调用结果,而是通过状态,通知,回调。
8. 异步与阻塞的关系:异步也会调用阻塞的函数,比如用select 函数,当select 返回可读时再去read 一般都不会被阻塞,但是read是一个阻塞的函数。
9. 同步异步和阻塞非阻塞之间的区别:同步异步是如何通知的概念,阻塞和非阻塞是如何执行的概念。
二、 同步/异步与阻塞/非阻塞的组合分析
同步阻塞形式: 等待执行结果是一直等待,执行时线程挂起(未对fd 设置O_NONBLOCK 标志位的read/write 操作)
同步非阻塞形式:等待执行结果是一直等待,执行时函数立即返回(对fd 设置O_NONBLOCK 标志位的read/write 操作)
异步阻塞形式:不是在处理消息时一直等待(通过状态、通知,或回调函数通知主调函数select ),而是在等待消息被触发时被阻塞(线程挂起).如果select 函数,的最后一个timeout 参数为NULL,程序就会停止在select这里。
异步非阻塞形式:在处理消息是不等待,在执行消息是也不等待。