- Go語言高級(jí)編程(第2版)
- 柴樹杉 曹春暉
- 500字
- 2025-08-07 17:56:16
1.5.7 不靠譜的同步
前面我們已經(jīng)分析過,下面代碼無法保證正常打印結(jié)果,實(shí)際的運(yùn)行也大概率不能正常輸出結(jié)?果。
func main() { go println("你好, 世界") }
如果剛接觸Go語言,可能希望通過加入一個(gè)隨機(jī)的休眠時(shí)間來保證正常的輸出:
func main() { go println("hello, world") time.Sleep(time.Second) }
因?yàn)橹骶€程休眠了1秒,所以這個(gè)程序大概率是可以正常輸出結(jié)果的。因此,很多人會(huì)覺得這個(gè)程序已經(jīng)沒有問題了。但是這個(gè)程序是不穩(wěn)健的,依然有失敗的可能。我們先假設(shè)程序是可以穩(wěn)定輸出結(jié)果的。因?yàn)镚o線程的啟動(dòng)是非阻塞的,main
線程顯式休眠了1秒退出導(dǎo)致程序結(jié)束,我們可以近似地認(rèn)為程序總共執(zhí)行了1秒多。現(xiàn)在假設(shè)println
()
函數(shù)內(nèi)部實(shí)現(xiàn)休眠的時(shí)間大于main
線程休眠的時(shí)間,這樣就會(huì)導(dǎo)致矛盾:后臺(tái)線程既然先于main
線程完成打印,那么執(zhí)行時(shí)間肯定是小于main
線程執(zhí)行時(shí)間的。當(dāng)然這是不可能?的。
嚴(yán)謹(jǐn)?shù)牟l(fā)程序的正確性不應(yīng)該依賴于CPU的執(zhí)行速度和休眠時(shí)間等不靠譜的因素。嚴(yán)謹(jǐn)?shù)牟l(fā)應(yīng)該是可以靜態(tài)推導(dǎo)出結(jié)果的:根據(jù)線程內(nèi)順序一致性,結(jié)合通道或sync
事件的可排序性來推導(dǎo),最終完成各個(gè)線程各段代碼的偏序關(guān)系排序。如果兩個(gè)事件無法根據(jù)此規(guī)則來排序,那么它們就是并發(fā)的,也就是執(zhí)行先后順序不可靠?的。
解決同步問題的思路是相同的:使用顯式的同?步。
- 極簡(jiǎn)算法史:從數(shù)學(xué)到機(jī)器的故事
- PWA入門與實(shí)踐
- SOA實(shí)踐
- Machine Learning with R Cookbook(Second Edition)
- Raspberry Pi for Secret Agents(Third Edition)
- 精通Scrapy網(wǎng)絡(luò)爬蟲
- 軟件項(xiàng)目管理實(shí)用教程
- Protocol-Oriented Programming with Swift
- Creating Stunning Dashboards with QlikView
- Python期貨量化交易實(shí)戰(zhàn)
- MySQL 8從零開始學(xué)(視頻教學(xué)版)
- Modernizing Legacy Applications in PHP
- 軟件測(cè)試分析與實(shí)踐
- 輕松學(xué)Scratch 3.0 少兒編程(全彩)
- Implementing Splunk(Second Edition)