1. 程式人生 > >Qt理解同步/非同步和阻塞/非阻塞的區別

Qt理解同步/非同步和阻塞/非阻塞的區別

同步、非同步:

概念:訊息的通知機制
解釋:涉及到IO通知機制;所謂同步,就是發起呼叫後,被呼叫者處理訊息,必須等處理完才直接返回結果,沒處理完之前是不返回的,呼叫者主動等待結果;所謂非同步,就是發起呼叫後,被呼叫者直接返回,但是並沒有返回結果,等處理完訊息後,通過狀態、通知或者回調函式來通知呼叫者,呼叫者被動接收結果。


阻塞、非阻塞:
概念:程式等待呼叫結果時的狀態
解釋:涉及到CPU執行緒排程;所謂阻塞,就是呼叫結果返回之前,該執行執行緒會被掛起,不釋放CPU執行權,執行緒不能做其它事情,只能等待,只有等到呼叫結果返回了,才能接著往下執行;所謂非阻塞,就是在沒有獲取呼叫結果時,不是一直等待,執行緒可以往下執行,如果是同步的,通過輪詢的方式檢查有沒有呼叫結果返回,如果是非同步的,會通知回撥。


經典故事案例:
人物:老張
道具:普通水壺(水燒開不響);響水壺(水燒開發出響聲)
案例:
                       1、同步阻塞:
                             老張在廚房用普通水壺燒水,一直在廚房等著(阻塞),盯到水燒開(同步);
                       2、非同步阻塞:
                             老張在廚房用響水壺燒水,一直在廚房中等著(阻塞),直到水壺發出響聲(非同步),老張知道水燒開了;
                       3、同步非阻塞:
                             老張在廚房用普通水壺燒水,在燒水過程中,就到客廳去看電視(非阻塞),然後時不時去廚房看看水燒開了沒                                                           (輪詢檢查同步結果);
                       4、非同步非阻塞:
                             老張在廚房用響水壺燒水,在燒水過程中,就到客廳去看電視(非阻塞),當水壺發出響聲(非同步),老張就知道                                                        水燒開了。

注意:
         1、通常的IO、NIO操作,都是同步的;
         2、JDK1.7提供了AIO非同步操作的類,如AsynchronousSocketChannel、AsynchronousServerSocketChannel等;
               Java也可以通過多執行緒,在開啟的執行緒中,通過回撥方式,實現非同步操作。