sync.Mutexによる排他制御(Lock, Unlock)

goroutineによる並行処理で共有リソースにアクセスしなければならないとき、排他制御が必要になります。ここでは、sync.Mutexを利用した排他制御の実装方法を確認します。(mutexは、mutual exclusionの略です。)

排他制御をせずにエラーが発生する例

まずは、排他制御をしない場合に発生するエラーについて確認します。

package main

import (
	"fmt"
	"sync"
)

type counter struct {
	v map[string]int
}

func (c *counter) Inc(wg *sync.WaitGroup) {
	defer wg.Done()
	c.v["wakuwaku"]++
}

func main() {
	wg := sync.WaitGroup{}

	c := counter{v: make(map[string]int)}
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go c.Inc(&wg)
	}

	wg.Wait()
	fmt.Printf("%v", c.v)
}

上記処理を実行すると、以下エラーが発生します。

fatal error: concurrent map writes

map型の変数に対して、書き込みが競合したことによるエラーです。

goコマンドの -raceオプション を利用して競合を検出することもできます。

$ go run -race main.go 
==================
WARNING: DATA RACE
(省略)
==================
==================
WARNING: DATA RACE
(省略)
==================
==================
WARNING: DATA RACE
(省略)
==================
map[wakuwaku:1000]Found 3 data race(s)
exit status 66

競合が存在する場合、上記のようにWARNINGが表示されます。

sync.Mutexによる排他制御

sync.Mutexを利用して、書き込みが競合しないように排他制御します。

package main

import (
	"fmt"
	"sync"
)

type counter struct {
	mu sync.Mutex 	// 追加
	v  map[string]int
}

func (c *counter) Inc(wg *sync.WaitGroup) {
	defer wg.Done()
	c.mu.Lock() 	// 追加
	c.v["wakuwaku"]++
	c.mu.Unlock() 	// 追加
}

func main() {
	wg := sync.WaitGroup{}

	c := counter{v: make(map[string]int)}
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go c.Inc(&wg)
	}

	wg.Wait()
	fmt.Printf("%v", c.v)
}
map[wakuwaku:1000]

-raceオプション での確認でもWARNINGが表示されなくなりました。

$ go run -race main.go 
map[wakuwaku:1000]

参考

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。