0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go言語学習】チャネルとミューテックス

Posted at

チャネル

ゴルーチン間でデータを安全にやり取りするための手段。
データの送受信が同期的に行われるため、データ競合を防ぐことができる。
チャネルはゴルーチンの同期にも使用でき、一つのゴルーチンが結果を計算し、その結果を別のゴルーチンに送信するといった場合に便利である。
→同期処理

ミューテックス

一つのゴルーチンだけが特定のリソース(例えば、共有データ構造)にアクセスできるようにするための手段。
複数のゴルーチンが同時に同じリソースにアクセスしようとしたときのデータ競合を防ぐために使用される。
→排他制御

package main

import (
	"fmt"
	"sync"
	"time"
)

type SafeCounter struct {
	v   map[string]int
	mux sync.Mutex
}

func (c *SafeCounter) Inc(key string, ch chan int) {
	c.mux.Lock()
	c.v[key]++
	c.mux.Unlock()
	ch <- c.v[key]
}

func main() {
	c := SafeCounter{v: make(map[string]int)}
	ch := make(chan int)

	for i := 0; i < 1000; i++ {
		go c.Inc("somekey", ch)
	}

	go func() {
		for i := range ch {
			fmt.Println(i)
		}
	}()

	time.Sleep(time.Second)
	close(ch)
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?