I am new to GO. I am specifically trying to add values to an array in parallel using locks (i do not want to use channels). But somehow my answer is not correct. I have tried both approaches. Passing a pointer to slice and Passing the slice itself. I am not looking for a global lock variable.
Method 1 (Passing pointer)
type locks_block struct {
population int
mux sync.Mutex
}
func incr(ar *[] locks_block){
for i:=0;i<len(*ar);i++ {
(*ar)[i].mux.Lock()
(*ar)[i].population = (*ar)[i].population+1;
(*ar)[i].mux.Unlock()
}
}
func main() {
arr := make([]locks_block,5);
go incr(&arr);
go incr(&arr);
go incr(&arr);
go incr(&arr);
fmt.Println(arr);
}
Method 2 (Passing slice)
type locks_block struct {
population int
mux sync.Mutex
}
func incr(ar [] locks_block){
for i:=0;i<len(ar);i++ {
ar[i].mux.Lock()
ar[i].population = ar[i].population+1;
ar[i].mux.Unlock()
}
}
func main() {
arr := make([]locks_block,5);
go incr(arr);
go incr(arr);
go incr(arr);
go incr(arr);
fmt.Println(arr);
}
The output is not correct in either case.