同步、异步、阻塞、非阻塞概念和各自之间的关系

来源:互联网 发布:java正则表达式$ 编辑:程序博客网 时间:2024/05/20 06:51

一、        一 概念

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这里。

异步非阻塞形式:在处理消息是不等待,在执行消息是也不等待。

原创粉丝点击