如何同步执行并发初始化切片的go例程?

时间:2018-08-11 03:46:16

标签: go memory concurrency parallel-processing synchronization

我正在尝试使用go例程以并行方式初始化项目数组。但是,即使我使用了建议的原语(通道),Go的奇怪的内存行为也阻止了我这样做。以下是最小复制:

List<String> personStr = Arrays.asList("1, Franck, 1980-01-01T00:00:00", "2, Marc, 1981-01-01T00:00:00");
List<Person> persons = personStr.stream()
        .map(s -> s.replaceAll(" ", "").split(","))
        .map(a -> new Person(Integer.parseInt(a[0]), a[1], LocalDateTime.parse(a[2])))
        .collect(Collectors.toList());

该代码应该将.scss数组初始化为0-9,但不会初始化。相反,将产生错误。我在Goland 2018.1上尝试了此代码

1 个答案:

答案 0 :(得分:2)

由于代码是同时运行的,因此每次调用goroutine时都会修改变量def printSleeping(): sleep = "I'm sleeping" v = "" for i in sleep: v += i system('cls') print v time.sleep(0.02) ,因为它们都引用了相同的变量i

为防止这种情况发生,请将index参数传递给您的匿名函数。

i

另一种方法是使用以下声明样式

package main

import "fmt"

func main() {
  toInit := make([]int, 10)
  syncLock := make(chan bool)

for i := range toInit{
    go func(i int){
      toInit[i] = i; 
      syncLock <- true}(i)
}

for range toInit{
    <-syncLock
}

for i := range toInit{
    if toInit[i] != i{
        fmt.Println("error")
    }
}
}

这是关于closures and goroutines

的不错的文档