官术网_书友最值得收藏!

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í)行先后順序不可靠?的。

解決同步問題的思路是相同的:使用顯式的同?步。

主站蜘蛛池模板: 察雅县| 赞皇县| 泰顺县| 开鲁县| 天柱县| 木里| 广饶县| 荣昌县| 陕西省| 台中市| 永兴县| 亳州市| 兴宁市| 新宁县| 米泉市| 五原县| 库尔勒市| 井陉县| 都匀市| 揭东县| 安吉县| 江华| 江达县| 哈密市| 峨边| 桑植县| 秦皇岛市| 东丽区| 尉犁县| 衡东县| 岳普湖县| 湖北省| 洪洞县| 滕州市| 隆安县| 三都| 达拉特旗| 大英县| 台东市| 楚雄市| 白沙|