📕
Go 語言程式設計入門
  • 最新消息
  • 中文版更新日誌
  • 譯者誌謝
  • 01-起步走
    • 01.01-檔案與資料夾
    • 01.02-終端機(Terminal)
    • 01.03-文字編輯器
    • 01.04-Go 的工具
  • 02-你的第一個程式
    • 02.01-如何讀 Go 程式
    • 02.02-問題
  • 03-型別
    • 03.01-數字
    • 03.02-字串
    • 03.03-問題
  • 04-變數
    • 04.01-如何命名變數
    • 04.02-Scope(變數的作用範圍)
    • 04.03-常數(Constant)
    • 04.04-定義多個變數
    • 04.05-範例程式
    • 04.06-問題
  • 05-控制結構
    • 05.01-For
    • 05.02-If
    • 05.03-switch
    • 05.04-問題
  • 06-Array、Slice 與 Map
    • 06.01-陣列(Array)
    • 06.02-Slice
    • 06.03-Map
    • 06.04-問題
  • 07-函式
    • 07.01-你的第二個函式
    • 07.02-回傳多個值
    • 07.03-參數個數可變的函式(Variadic Function)
    • 07.04-Closure
    • 07.05-遞迴(Recursive)
    • 07.06-Defer, Panic & Recover
    • 07.07-Panic & Recover
    • 07.08-問題
  • 08-指標
    • 08.01-「*」與「&」運算符號
    • 08.02-new
    • 08.03-問題
  • 09-Struct 與 Interface
    • 09.01-struct
    • 09.02-Method
    • 09.03-Interface
    • 09.04-問題
  • 10-Concurrency(平行處理)
    • 10.01-Goroutine
    • 10.02-Channel
    • 10.03-問題
  • 11-Packages
    • 11.01-建立 Package
    • 11.02-文件
    • 11.03-問題
  • 12-測試
  • 13-The Core Packages
    • 13.01-字串
    • 13.02-輸入與輸出
    • 13.03-檔案與資料夾
    • 13.04-錯誤訊息
    • 13.05-Container 與 Sort
    • 13.06-雜湊&加解密
    • 13.07-伺服器
    • 13.08-解析命令列參數
    • 13.09-Synchronization Primitives(同步處理原始物件)
  • 14-下一步
    • 14.01-閱讀大師作品
    • 14.02-動手實作
    • 14.03-團隊合作
  • 15. 附錄-額外資源
Powered by GitBook
On this page
Edit on GitHub
  1. 13-The Core Packages

13.09-Synchronization Primitives(同步處理原始物件)

在 Go 語言中,在並行(concurrency)與同步(synchronization)方面的處理上,建議使用使用第10章討論的 Goroutine 與 channel 方式。然而,Go 語言在 sync 與 sync/atomic package 中也有提供了較為傳統的多執行緒常式(multithreading routine)。

Mutexes(互斥鎖)

一個 mutex (mutal exclusive lock) 會將一段程式碼一次只鎖定給單個執行緒,可保護共用的資源在非原子式操作出現競速條件(race condition)。下列是一個 mutex 的範例:

package main

import (
    "fmt"
    "sync"
    "time"
)
func main() {
    m := new(sync.Mutex)
    
    for i := 0; i < 10; i++ {
        go func(i int) {
            m.Lock()
            fmt.Println(i, "start")
            time.Sleep(time.Second)
            fmt.Println(i, "end")
            m.Unlock()
        }(i)
    }

    var input string
    fmt.Scanln(&input)
}

在 mutex (m) 處於上鎖狀態時,其他想要對此 mutex 進行上鎖的動作都會受到阻塞(block),直到此 mutex 已經被解鎖為止。在使用 sync/atomic package 中的 mutex 或同步處理原始物件(Synchronization Primitives )時要非常謹慎。

以往要設計多執行緒程式是有難度的,因為很容易產生難以發現的錯誤。由於這些錯誤可能取決於非常特定的情況、極少發生,而且難以完成重現這些情況的條件。而 Go 語言最強大之處在於,它提供的並行功能比執行緒與互斥鎖更易於理解與使用。

Previous13.08-解析命令列參數Next14-下一步

Last updated 2 years ago