동시 고루틴이 공유 매개변수를 수정할 때 Go 함수 매개변수 전달에 다음 규칙이 존재합니다. 값으로 전달: 복사본이 함수에 전달되며 복사본을 변경해도 원래 값에는 영향을 미치지 않습니다. 참조로 전달: 포인터가 함수에 전달되고 포인터 값을 변경하면 원래 값도 수정됩니다. 참조로 전달할 때 여러 고루틴이 매개변수를 동시에 수정하면 동시성 문제가 발생할 수 있습니다. 공유 데이터 동시성 시나리오에서 참조별 전달은 적절한 동시성 제어 조치와 함께 주의해서 사용해야 합니다.
Go에서는 함수 매개변수를 값이나 참조로 전달할 수 있습니다. 값으로 전달하는 경우 매개변수의 복사본이 함수에 전달되는 반면, 참조로 전달하는 경우 매개변수에 대한 수정 사항이 호출하는 함수에 반영됩니다.
그러나 동시 환경에서는 이 매개변수 전달 패턴으로 인해 동시 실행이 복잡해질 수 있습니다. 동시에 실행되는 여러 고루틴이 동일한 매개변수를 동시에 수정할 수 있기 때문입니다.
func modifyInt(i int) { i++ // 只修改 i 变量的副本 } func main() { i := 0 go modifyInt(i) fmt.Println(i) // 输出 0(原始值) }
값으로 전달의 경우 modifyInt()
함수가 전달된 i
의 복사본을 수정하지만 호출 함수는 원본 i
변수는 영향을 받지 않습니다. modifyInt()
函数修改了传递给它的 i
的副本,但调用函数中的原始 i
变量不受影响。
func modifyIntPointer(i *int) { *i++ // 修改 i 变量的实际值 } func main() { i := 0 go modifyIntPointer(&i) fmt.Println(i) // 输出 1(修改后的值) }
在按引用传递的情况下,对指向原始 i
变量的指针参数的修改将反映在调用函数中。这可能会导致并发并发症,因为多个 Goroutine 可能会同时修改同一参数。
考虑以下读写锁案例,它保护对共享数据的并发访问。
type MutexMap struct { m map[string]int mu sync.Mutex // 互斥锁 } func (m *MutexMap) Get(key string) int { m.mu.Lock() // 加锁 defer m.mu.Unlock() // 解锁(延迟执行) return m.m[key] } func (m *MutexMap) Set(key string, value int) { m.mu.Lock() defer m.mu.Unlock() m.m[key] = value }
如果 MutexMap
的 m
i
변수를 가리키는 포인터 인수에 대한 수정 사항이 호출 함수에 반영됩니다. 여러 고루틴이 동시에 동일한 매개변수를 수정할 수 있으므로 동시성 문제가 발생할 수 있습니다. 실용 사례🎜🎜공유 데이터에 대한 동시 액세스를 보호하는 다음 읽기-쓰기 잠금 사례를 고려하세요. 🎜rrreee🎜MutexMap
의 m
필드가 참조로 전달되면 여러 고루틴이 동시에 잠겨 교착 상태가 발생할 수 있습니다. 🎜🎜결론🎜🎜동시 환경에서는 함수 매개변수 전달 패턴과 이것이 공유 데이터에 미치는 잠재적 영향을 이해하는 것이 중요합니다. 일반적으로 값으로 전달하는 것이 더 안전하지만, 참조로 전달하는 방법은 적절한 동시성 제어와 함께 주의해서 사용해야 합니다. 🎜위 내용은 Golang 함수 매개변수 전달 시 동시성 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!