다음은 데이터에 안전하게 액세스하기 위해 뮤텍스 잠금을 사용하는 방법의 예입니다. 내 질문은 뮤텍스 잠금 및 잠금 해제 대신 CSP (통신 순차 프로세스)를 사용하여 동일한 작업을 수행하는 방법은 무엇입니까? 당신이 실제로 이동 채널을 구현하는 방법을 본다면채널을 안전하게 사용하여 골란에서 데이터를 동기화하는 방법
type Stack struct {
top *Element
size int
sync.Mutex
}
func (ss *Stack) Len() int {
ss.Lock()
size := ss.size
ss.Unlock()
return size
}
func (ss *Stack) Push(value interface{}) {
ss.Lock()
ss.top = &Element{value, ss.top}
ss.size++
ss.Unlock()
}
func (ss *SafeStack) Pop() (value interface{}) {
ss.Lock()
size := ss.size
ss.Unlock()
if size > 0 {
ss.Lock()
value, ss.top = ss.top.value, ss.top.next
ss.size--
ss.Unlock()
return
}
return nil
}
숙제 문제입니까? 'Element'의 정의를 포함하여 코드가 누락 된 것 같습니다. –
왜? 뮤텍스는이 경우에 사용할 올바른 기본 요소입니까? (또한, 그것은 훨씬 더 깨끗하고 에러를 덜 일으키는'defer'를 사용합니다. – JimB
채널 패러다임의 모든 목적은 뮤텍스를 제거하는 것입니다. 채널을 사용하면 채널없이 동기화 할 수 있습니다. 그러나 당신에게 보여주기 위해서, 우리는 당신의 실제 코드를 필요로 할 것입니다. 단지 잠금 코드가 아닙니다. 일반적으로 채널을 효과적으로 사용하려면 프로그램 아키텍처를 설계해야합니다. 효과적으로 사용하기 위해 몇 줄을 바꿀 수는 없습니다. – sinned