インフラ勉強会:スレッドセーフ講義
エンジニアライフの読者の皆様、こんにちは。
北陸(石川県金沢)在住で、テクニカルライター&プログラマーの平田豊(ひらたゆたか)です。
今回は、インフラ勉強会(詳細は第1回目の記事参照)で過去に開催された講義について紹介します。なお、本記事の執筆にあたり、スピーカーであるしんやさんの許可をいただいております。どうもありがとうございます。
講義資料
講義資料はこちらのサイトで公開されています。
講義中の音声が録音されており、音声データも公開されています(容量の関係で、将来削除される可能性あり)。
講義に参加された方々が有志でWikiにログをまとめてあり、講義終了後に参照できるようになっています。
オフラインの交流会では講義資料が公開されることはあっても、音声データや参加者によるログまで作られることはないので、そういった意味ではインフラ勉強会はオンラインならではの付加価値であるといえます。
スピーカーの紹介
今回登壇されたしんやさんという組み込みエンジニアの方で、ツイッター(@NAGAYASU_Shinya)でもあるネタで有名でファンも多いです。こうしたネットでの有名人が登壇されるというのも、インフラ勉強会ならではの特徴だと言えますね。なかなか、オフラインの勉強会や交流会では有名人にお目にかかることはありませんから。
しんやさんは組み込みエンジニア向けのブログ(下記)を執筆されています。なかなか組み込み系の現場の方が、表に向けて情報発信されることは少ないので、大変貴重なブログです。
講義のテーマ
講義のテーマはスレッドセーフ(Thread-safe)についてです。プログラミングをやらない方にはピンと来ないかもしれませんが、複数同時に実行される処理のそれぞれが共有資源にアクセスする場合において、共有資源へのアクセスが競合して、処理結果が不正となることを防ぐ必要があり、そのしくみのことをスレッドセーフと呼びます。
より一般的な言い方をすれば、排他制御(はいたせいぎょ)になります。排他制御の英語表記は"Mutual exclusion"なので、「ミューテックス」という呼び方をすることもあります。
以下に簡単な例を示します。
条件
・変数aの初期値はゼロ
・タスクAは変数aの値を1つ増やす
・タスクBは変数aの値を1つ増やす
・タスクAとBは同時に動作開始する
という条件にします。
排他制御ありの場合
タスクAとBが同時に動作しても、排他制御を正しく行っていれば、変数aは"2"という値になります。
排他制御なしの場合
変数aの値は"1"になったり、"2"になったり、まちまちの結果となります。なぜならば、タスクAおよびBが動き出した時、変数aの値が"0"になっているのか、"1"になっているか分からないからです。タスクAとBが「同時に」動くと言っても、わずかなズレはあるので、少しでもいずれかのタスクが先に処理が進むかどうかで結果が変わってくるのです。
インフラ勉強会の醍醐味
この講義の会は夜に行われたこともあり、スピーカーの方が途中からお酒を飲んだことで少し酔ったのか、口調が変わっていくのが面白かったです。別にふざけているわけではないのですが、話す側も聞く側も自宅にいながら、楽しく学べるというところも、インフラ勉強会ならではの醍醐味であると感じました。
また、実際の講義は今年の3/24に行われましたが、1ヶ月近く経過した現時点においても講義資料と音声データで復習ができるというのもありがたいことです。
しんやさん、登壇していただきありがとうございました。次回も期待しています!