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?

More than 3 years have passed since last update.

goroutineで値(変数)を共有する

Posted at

go routineのスレッド間でデータを共有する

※本記事は備忘録として記載したものでありますため、ご容赦ください。

goroutineで動作している関数でデータを共有するには、

  1. 引数として渡す方法
  2. クロージャのローカル変数にキャプチャして渡す方法
    があります。
package main

import (
	"fmt"
	"time"
)

func sub1(c int) {
	fmt.Println("share by arguments : ", c*c)
}

func main() {
	// 引数で渡す方法
	go sub1(10)

	// クロージャのキャプチャで渡す方法
	c := 20
	go func() {
		fmt.Println("share by capture : ", c*c)
	}()

	time.Sleep(time.Second)
}
# 結果
share by arguments :  100
share by capture :  400

クロージャのキャプチャ渡しの場合も、内部的には無名関数に引数が追加されて参照が渡されるため、厳密には同じ動きとなります。

forを使用してみる

package main

import (
	"fmt"
	"time"
)

func main() {
	tasks := []string{
		"cmake ..",
		"cmake . --build release",
		"cpack",
	}
	for _, task := range tasks {
		go func() {
			// goroutineが起動する時にはループが回り切って
			// 全部のtaskが最後のタスクになってしまう
			fmt.Println(task)
		}()
	}
	time.Sleep(time.Second)
}
# 結果
cpack
cpack
cpack

高速ではありますが、単純なループに比べてgoroutineの起動が遅いため、taskに"cpack"が入った状態でループが回ってしまう。
このような場合は、引数経由にして明示的に値をコントロールするべきです。

子goroutineから親goroutineへの値渡し

両者は共有アドレスを参照しているため、上書きに注意が必要です。

参考

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?