なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

「Linuxとpthreadsによるマルチスレッドプログラミング入門」を読んでみた

きっかけ

MySQLで接続数増やして同じテーブルへのアクセスが増えると、SHOW ENGINE INNODB STATUSのSEMAPHOREのところにいっぱい情報が出てくる「Mutex」がイマイチ分からん」と、MySQLを触り初めて以来、ずっと思っていました。


MySQLのSHOW ENGINE INNODB STATUSは、「処理が詰まっているのは、ソースコードのこの位置だよ」ってところまで丁寧に教えてくれるので、試しにソースを読んでみたりするのですが、「ほげほげ->mutex」ってところにヒットして、「ふーん、なるほど(わかってない」で終了していました。


そもそも自分はまともにC言語が扱えない。そして難解と言われているMySQLソースコードリーディングは、何度チャレンジしても挫折している状況。


そんな調子でモヤモヤをひきずっていたのですが、この「Linuxとpthreadsによる マルチスレッドプログラミング入門 (プログラミング基礎講座) 」は目次=章・節の名前レベルで「mutex」という単語が出てくる本だったので興味を持ち、しばらくAmazonの「欲しい物リスト」に入れておきつつ相場変動を追っていたら、Kindle版がセールで半額になったので購入。


自分のレベル

大学(文学部。情報系ではない)の一般教養の半期科目でC言語の授業を選択。ただしstdio.hは「おまじない」扱いで、そもそもヘッダファイルとは何か、にすらまともに触れず、基本文法をなぞってみるレベルの内容。

情報処理試験が第1種、第2種という区分だった頃、就職を意識して第2種(≒基本情報?)を受験するに当たり、プログラミング言語設問の選択で、上記でちょっと触れたC言語を選択。ただし、対策問題集でもstdio.hを超えない。マクロも扱わない。標準入出力で数値と文字を扱う範囲のことしかやらない。処理結果の確認のためにprintfするばかりで、fgetsの解説があった記憶すらない。


なお、そんなレベルのテキストで試験対策していて本試験でいきなりRGBを使ったりメモリ管理したり、といった問題が出てパニクるも、落ち着いて勘を研ぎ澄ませてギリ合格。


その後、「独習C」を読んでやってみた程度で、仕事でC言語を使った開発は一切やったことがないです。


C言語以外の開発は、VisualBasicJavaPL/SQLをかじった程度。
今はプログラマではなくDB周りの構築・改善がメイン、書く機会があるのはBashスクリプト、あるいは1クラス100行程度に収まるJavaJDBC触る程度)。
過去も開発よりも調整メインのSE・コンサルや非エンジニア職の方が多い、みたいな経歴です。



そんな状態からのチャレンジなので、とにかく、わからなくても写経して動かしてみて、わからないところ調べて、という感じで取り組みました。

環境について

VirualBox内にCentOS7を立てて、viでソースを書いて、makeでビルド。それだけ。


EclipseとかVSCodeといったIDEC言語の開発環境を作るノウハウすら持っていなかったので。。。


IDEについては、情報処理試験対策のころはBorland C++ Builder!なんてのがあったなあ。その後、仕事では10年異常前にEclipseJavaの開発をちょっとやった程度。
あんな感じで、定義の参照ができたり、ソース間をぴょんぴょん行き来しながらソース読めるC/C++言語用の環境の作り方を知りたい。。(GNU GLOBALはちょっといじったことがあるけど)


感想

マルチスレッドプログラミングの概要から、スレッド間のデータ共有、排他制御やデータ保護などにおけるpthread_mutex_xxxやpthread_cond_xxxの使い方、それらの応用としてのキュー実装やソケットプログラミングにおけるワーカースレッドなどが解説されていて、自分が知りたい範囲をいい感じに取り扱っている本でした。


とにかく一通り写経してみて、mutexの取り扱いの作法がおおよそつかめたように思います。
ちゃんと動くソースコードが記載&ファイル提供されていて、文中での説明も丁寧でした。

こんなピンポイントなテーマの本なので、「その手前まではわかってるでしょ?」で突き放されても文句は言えないのですが、こんなレベルの自分でも、ちゃんと動かせました。

とにかく自力で写経して、コンパイルしてみて、エラーメッセージに基づいてデバッグして、さらにわからないところは提供コードとdiff取って潰して、関数等で意味わからないところはネットで追加で調べて、みたいなことを繰り返し。

途中躓いて自力で調べたのは、「for文で使う変数定義はfor文の前に型指定しないとコンパイル通らない(提供コードがビルドできなかった)」ぐらいだと思います。



出版不況の中、こういった本はなかなか商業流通では出しにくくなって来ていますが、やはり書籍にまとまっていると取り組みやすいです。

これで、MySQL内で多用されているMutexと、少しだけ仲良くなれそうな気がします。


なお、Makefileについては見様見真似で書いただけなので、中身の意味はほとんど理解できてないです。。。次はコレか。(どこに向かっているのか