解析(一) 同步 非同步

2021-09-26 10:11:15 字數 1618 閱讀 6226

目錄

同步:非同步: 注:

參考:問題(一):請說明一下執行緒中的同步和非同步有何異同?並且請舉例說明在什麼情況下會使用到同步和非同步?

兩個程序間的訊息隱含著某種程式的同步:只有當乙個程序傳送出訊息之後,接受者才能接收訊息。且當乙個程序產生了send或者receive原語後,需要確定會發生什麼。

即發出乙個請求,等待返回,然後才發出下乙個請求。例如打**的過程就是同步的,打**的人撥號之後,接**的人接通才能進行通話。

以send原語為例。當乙個程序執行了send原語時,會有兩種可能:傳送被阻塞,或者直接傳送成功。receive原語類似,當乙個程序執行了receive原語之後,也會出現兩種情況:

1、如果一條訊息在此之前已經被傳送,則該條訊息被接受並繼續執行。

2、如果沒有正在等待的訊息,則該程序被阻塞,直到有一條訊息到達。或者該程序繼續執行,放棄此次接收。

所以傳送者和接受者都有可能被阻塞或者不阻塞。

通常有3種組合:

1、阻塞send,阻塞receive:傳送者和接受者都被阻塞,直到完成資訊交付。也稱為會和,它考慮到了程序間的緊密同步。

2、無阻塞send,阻塞receive:儘管傳送者可以繼續傳送,但是接收者被阻塞了,直到有訊息的到達。這種情況允許乙個程序給各個目標傳送一條或者多條訊息。在繼續工作前必須收到訊息的程序將被阻塞。

3、無阻塞send,無阻塞receive:不要求任何一方等待。

一般而言,無阻塞send是最自然的。但是無阻塞send存在乙個潛在的危險:錯誤會導致程序重複的產生訊息。因為該程序唯有阻塞,這些重複的訊息就會消耗大量的系統資源(包括處理器時間和緩衝區空間),從而威脅到其他程序及作業系統。同時無阻塞send也給程式設計師增加了負擔,傳送程序每次都需要確定訊息是否被接收成功,所以要設計乙個應答訊息來告訴傳送程序:接收者收到訊息了。

同樣,阻塞receive原語也是最自然的。請求乙個訊息的程序需要這條訊息才可以繼續執行。一旦訊息發生了丟失,或者該訊息在被傳送的時候就傳送失敗,導致接收程序收不到訊息,那麼該程序就會被阻塞。這個問題可以通過無阻塞receive來解決,但是這種方法也有一定的危險:如果夏曦的傳送在在乙個程序已經執行了與之相匹配的receive之後,那麼該訊息就會被丟失。

其他可能的方法如:

允許乙個程序在產生receive之前測試是否有乙個訊息在等待;

允許程序在receive原語中確定多個程序。

如果有乙個程序正在等待從多個源程序傳送的訊息,並且只要有一條訊息到達就可以繼續執行,則採用後一種方法比較可行。

發出乙個請求,不等待返回,隨時可以傳送下乙個請求。例如廣播,發起者不用關心接受者的狀態,也不用等接受者的反饋,隨時發起下一次操作。

同步和非同步最大的區別就在於同步需要等待,非同步不需要等待。同步一定存在著阻塞狀態,而非同步一定不存在非阻塞的狀態。阻塞和非阻塞強調的是程式在等待呼叫結果(訊息,返回值)時的狀態. 。

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。 對於同步呼叫來說,很多時候當前執行緒還是啟用的狀態,只是從邏輯上當前函式沒有返回而已,即同步等待時什麼都不幹,白白占用著資源。同步和非同步強調的是訊息通訊機制 (synchronous communication/ asynchronous communication)。

非同步 同步委託解析(一)

委託的定義想必大家都知道,它本質上是乙個類,我們定義乙個委託 1delegate intdecrement intx,inty 經過編譯後,編譯器自動生成乙個從multicastdelegate繼承下來的密封類 1sealed class decrement multicastdelegate2 那...

TCP通訊(一) 同步連線

這篇部落格主要包含兩個部分的內容 乙個是服務端的 乙個是客戶端的 一 服務端類 using system using system.collections.generic using system.linq using system.text using system.threading.tasks...

C Socket教程詳解一 同步TCP程式設計

非同步tcp程式設計傳送門 tcplistener類,伺服器監聽類,用於監聽和連線客戶端,該類重要方法如下 構造方法 public tcplistener ipendpoint iep public tcplistener ipaddress localaddress,int port 第乙個建構函...