以下は、安全にデータにアクセスするためにミューテックスロックを使用する方法の例です。私の質問は、私はどのようにミューテックスのロックとunlock'sを使用する代わりに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
チャネルパラダイムの目的は、mutexを取り除くことです。チャンネルを使用すると、チャンネルを使わずに同期することができます。しかし、あなたには、ロックコードだけでなく、実際のコードが必要です。通常、チャネルを効果的に使用するには、その周りにプログラムアーキテクチャを設計する必要があります。それらを効果的に使用するために、いくつかの行を変更することはできません。 – sinned