這是代碼:
var timePointer *[]time.Time
func UpdateHolidayList() error {
//updating logic: pulling list of holidays from API
holidaySlice := make([]time.Time, 0)
//appending some holidays of type time.Time to holidaySlice
//now holidaySlice contains a few time.Time values
timePointer = &holidaySlice
return nil
}
func main() {
//run UpdateHoliday every 7 days
go func() {
for {
UpdateHoliday()
time.Sleep(7 * 3600 * time.Hour)
}
}()
}
我有4個問題:
holidaySlice是區域變數,將(全域)指標指向它是否安全?- 這整個代碼多執行緒安全嗎?
- 指向
timePointer后holidaySlice,我可以通過訪問這些值嗎timePointer - (如果對 3. 的回答是“是”) 假期串列不斷變化,因此
holidaySlice每次更新都會有所不同。timePointer那么通過訪問的值會相應改變嗎?
uj5u.com熱心網友回復:
holidaySlice是分配在堆上的區域變數。任何指向同一堆位置的變數都可以訪問該位置的資料結構。它是否安全取決于您如何訪問它。即使holidaySlice沒有在堆上顯式分配,一旦你讓一個全域變數指向它,Go 編譯器會檢測到它“逃逸”,所以它會在堆上分配它。
該代碼不是執行緒安全的。您在沒有任何顯式同步的情況下修改共享變數(全域變數),因此無法保證其他 goroutine 何時或是否會看到對該變數的更新。
如果您在timePointer沒有顯式同步的情況下更新陣列的內容,則無法保證其他 goroutine 何時或是否會看到這些更新。您必須使用同步原語sync/Mutex來分隔對可以由多個 goroutine 更新/讀取的資料結構的讀/寫訪問。
uj5u.com熱心網友回復:
只要您的 main 沒有結束
timePointer就可以訪問holidaySlice創建的指標- 因為它的堆已分配,編譯器將檢測到它的逃逸而不是釋放記憶體。不,絕對不是。查看同步包
是的你可以。只記得迭代使用
*timePointer而不是timePointer它會改變——但不會相應地改變。由于您沒有進行任何同步 - 您沒有定義的方法來知道讀取資料時所指向的切片中存盤了哪些資料
timePointer。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315262.html
上一篇:如何在C中宣告指向結構的指標?
