Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Concurrency Bugsについての論文を読む

Concurrency Bugsについての論文を読む

keitatomozawa

January 25, 2020
Tweet

More Decks by keitatomozawa

Other Decks in Programming

Transcript

  1. 話すこと • “Understanding Real-World Concurrency Bugs in Go”という論文を読ん だと言う話 •

    “the morning paper”と言うサイトで紹介されているのが • misreading chat #73 で紹介されていたのを聞いたのがきっかけ • 詳しく知りたければ各サイトへGo
  2. バグの原因 misuse of message passing • channelが原因のバグ misuse of shared

    memory • Mutex, RWMutex, WaitGroup などが原因のバグ
  3. 結論 message passing shared memory Total blocking 49 36 85

    non-blocking 17 69 86 Total 66 105 171
  4. Non-blocking × shared memory • これもやはり一般的なプログラミング言語と同じような過ちが多い ◦ 論文内で “traditional” とされているもので50個ほど

    • 残りは大別して以下の二つ ◦ goroutineに渡す匿名関数内での変数スコープの誤りなど ◦ WaitGroup関連
  5. Blocking × message passing • Channel周りは気をつけよう • 例えば ◦ goroutineからchannel経由でmessageを受け取り後続の処理へ

    ◦ selectなどでtimeout処理をしたらgoroutineはchanに書き込める? ◦ →適切にBuffered Channelを使ったりする
  6. Non-blocking × message passing • 少ないものの存在(例:close chan twice) • channelの性質上正しく使えてない場合はblockingとして現れることが多

    いことを考えると、正しく使いこなせればよりエラーを起こしにくい仕組みで あると言えるようだ。