国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

java - 如何理解「不要透過共享記憶體來通信,而應(yīng)該透過通信來共享記憶體」?
大家講道理
大家講道理 2017-04-18 10:53:51
0
4
2090

不要通過共享內(nèi)存來通信,而應(yīng)該通過通信來共享內(nèi)存

這是一句風(fēng)靡golang社區(qū)的經(jīng)典語,對於剛接觸並發(fā)編程的人,該如何理解這句話?

大家講道理
大家講道理

光陰似箭催人老,日月如移越少年。

全部回覆(4)
Ty80

https://blog.golang.org/share...

這篇文章裡面說的比較清楚了,使用共享記憶體的話在多執(zhí)行緒的場景下為了處理競態(tài),需要加鎖,使用起來比較麻煩。另外使用過多的鎖,容易使得程式的程式碼邏輯堅澀難懂,並且容易使程式死鎖,死鎖了以後排查問題相當(dāng)困難,特別是很多鎖同時存在的時候。

go語言的channel保證同一個時間只有一個goroutine能夠存取裡面的數(shù)據(jù),為開發(fā)者提供了一種優(yōu)雅簡單的工具,所以go原生的做法就是使用channle來通信,而不是使用共享記憶體來通信。

Peter_Zhu

我認為前者的意思是大家都維護一個狀態(tài),後者是每個人都維護一份狀態(tài)副本。

洪濤

共享記憶體會涉及到多個執(zhí)行緒同時存取修改資料的情況,那得確保資料的安全性,可見性,那就會加鎖,加鎖會讓並行變?yōu)榇校琧pu也忙於執(zhí)行緒搶鎖。不如換一種方式,把資料複製一份,每個執(zhí)行緒有自己的,只要一個執(zhí)行緒乾完一件事其他執(zhí)行緒不用去搶鎖了,這就是一種通訊方式,把共享的以通知方式交給線程,實作並發(fā)

伊謝爾倫

其實如果從分散式的角度來理解,就會比較明了。

打比方,ab兩個進程共同對同一個訊息佇列進行操作,那麼,如果使用共享記憶體的話,是不是這兩個進程就必須局限在同一個實體機上,那麼通訊的意義就大大縮小了。

如果在設(shè)計的時候,對於訊息隊列,只提供讀寫接口,而對於內(nèi)部的實現(xiàn)你完全不用去在意,看起來消息隊列就像是共享內(nèi)存一樣了。然而你的訊息隊列可以利用socket進行通訊。

所以,上述這句話,不要用共享內(nèi)存實現(xiàn)通信是指不要讓程式一開始就局限在單機上,而是利用通信,也就是封裝內(nèi)部實現(xiàn),提供接口的方式來進行相應(yīng)的操作

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板