提供的程式碼中,引入了兩個函數:concurrentStruct()和concurrentStrucuctWithMuLock ()。這兩個函數同時讀取和寫入一個結構,但前者在沒有鎖定的情況下執行此操作並產生競爭警告。相反,後者使用讀寫互斥體來同步訪問,從而不會出現爭用警告。
如錯誤訊息所示,在下列情況下會發生資料爭用:
在concurrentStruct()中,出現這種情況是因為Metadata結構體的關鍵字段被多個goroutines存取和修改,而沒有任何同步。
雖然concurrentStruct()不使用鎖,但使用匿名goroutine 無限期運行會導致潛在的競爭條件。這些協程不斷地讀取、修改和寫入關鍵字段,而不考慮其他協程的操作。
與concurrentStruct()相比,concurrentStructWithMuLock()採用讀取操作-寫入互斥體以同步對關鍵字段的存取。這確保了互斥,防止多個 goroutine 同時修改該欄位。因此,不會發生競爭條件,且函數運行時不會發出警告。
concurrentMap() 函數示範了涉及 Go 映射的不同類型的競爭條件。雖然映射在 Go 中是線程安全的,但在沒有適當同步的情況下對映射進行並發讀取和寫入可能會導致致命錯誤。 Go 的運行時包含一個輕量級資料競爭偵測器,當它偵測到這種對映射的不同步存取時,它會導致程式崩潰,以防止未定義的行為。
以上是如何安全實現Go結構體的並發讀寫操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!