「なんでC言語のスレッドとする関数の引数は、構造体渡しにしなければならないのでしょうか?」と泣き言を言ってみました。
すでに他のサブシステムでがんじがらめになったCのプログラムでは、トレースが使えないので、デバッグはログに吐き出しながらの作業になります。
これが、結構な地獄で、つい先刻、改造したスレッドの稼動を確認できたのですが、愚痴がいいたくなりました(例えば、GO言語のGoroutineなんか、めちゃくちゃ簡単にスレッド作れる)。
ーーーーー ChatGPTの回答ここから ーーーーー
C言語のスレッド関数 (pthread_create()
で実行する関数) の引数として 構造体を渡すのが一般的 なのは、以下の 4つの理由 によります。
1. pthread_create()
の仕様
pthread_create()
のスレッド関数(スレッドのエントリポイント)には、単一の void*
型の引数 を受け取る関数を渡す必要があります。
pthread_create() のプロトタイプ
start_routine
はvoid *arg
という 単一の引数 を受け取る関数。arg
に渡せるのは ポインタのみ。
つまり、スレッドに複数のデータを渡したい場合、
1つの void*
にまとめる必要がある → 構造体で渡すのが一般的 ということになります。
2. 複数のデータを渡したい
スレッド関数で処理するのに 複数の引数(変数)を渡したい ことがよくあります。
例えば:
では、int
の値しか渡せません。
もし 複数の値を渡したい場合:
このように、構造体を使えば複数の値をまとめて渡せる ので便利です。
3. スレッドの実行中に変数が消えないようにする
スレッド関数に渡す引数は、スレッドが終了するまで有効 でなければなりません。
例えば:
この場合、もし num
がローカル変数で main()
の実行が終了すると、
そのメモリが解放されてしまい、スレッド関数内で num
を使うと 未定義動作 になります。
解決策
malloc()
で確保してpthread_create()
に渡す。- 構造体にして必要なデータを安全に渡す。
こうすれば、スレッドが終了するまで args
は有効になります。
4. スレッドごとに異なるデータを渡せる
スレッドを複数作成する場合、それぞれ異なるデータを渡すことが多い。
例えば、複数のスレッドに異なる ID
を渡す場合:
構造体なら、スレッドごとに異なるデータを安全に管理できる。
結論
pthread_create()
は 1つのvoid*
しか渡せない → 複数の値を渡すには構造体が便利- スレッド実行中に変数が消えると 未定義動作 → ヒープ領域に確保すれば安全
- 複数のスレッドに異なるデータを渡すのに構造体が適している
→ C言語のスレッドの引数は、構造体を渡すのが基本になる
ーーーーー ChatGPTの回答ここまで ーーーーー
まあ、そりゃそうなんだろうけどさ(そして、私としても、今さら仕様を変えられても困るんだけどさ)。でも構造体の引数に構造体が入ってくる場合、ポインタの記載方法で大混乱するんだよね。スレッド内部で構造体の分解も必要になるし。
-----
ところで、今なお、「プログラマーが好むプログラム言語」などという見出しの記事が散見されます。
開発するソフトウェアの内容によって、選ばれるプログラム言語は変ります。
ダムの掘削するのに「シャベル」を選ぶことはできませんし、家庭菜園をするのに「シャベルカー」を持ち込むことはできません。
プロのプログラマーなら、「シャベル」も「シャベルカー」も使えなければなりません。必要なら新しいプログラム言語を勉強して、仕事をしなければならないんです。
「プログラマーが好むプログラム言語」という考え方が、一体どこからやってくるのか、私は今でも分からないです。
「プログラマーが好むプログラム言語」などという、アホな内容の記事が散見されるのは何故でしょうか。見解を聞かせて下さい
ーーーーー ChatGPTの回答ここから ーーーーー
「プログラマーが好むプログラム言語」系の記事が散見される理由は、以下のような要因が考えられます。
-
簡単にウケるネタだから
プログラム言語の人気ランキングや「初心者向け」「稼げる言語」といったテーマは、プログラマーだけでなく、これから学ぼうとする人や経営層にも関心を持たれやすい。専門知識がなくても理解しやすいため、記事として書きやすく、アクセスを稼ぎやすい。 -
宗教戦争を煽ると盛り上がる
プログラマーには、それぞれ慣れ親しんだ言語やこだわりがあるため、「○○言語が最強!」といった記事を出せば議論が活発になり、SNSや掲示板で拡散される。結果として、PV(ページビュー)やエンゲージメントが向上し、メディア側の利益につながる。 -
技術を知らない人でも書けるから
プログラミングの実務に詳しくないライターでも、「流行りの言語ランキング」「人気の言語トップ10」といった記事なら、調査や寄せ集めで簡単に書ける。しかも、明確な正解がないため、適当にデータを並べるだけでも成立する。 -
初心者や未経験者向けの情報が求められている
現場のエンジニアにとっては無意味な話でも、これからプログラミングを学ぼうとする人には「どの言語を学べばいいか」という関心がある。需要がある以上、供給され続ける。 -
技術選定の本質を理解していない層が多い
本来、プログラム言語は開発するソフトウェアの要件や環境、チームのスキルセットに応じて選ばれるべきもの。しかし、「言語そのものの優劣」や「人気」だけで語ろうとする風潮が根強く、それに迎合した記事が多くなる。
結局のところ、**「簡単に書けて、簡単にウケて、簡単に拡散される」**から、この手の記事が量産されるわけです。
ーーーーー ChatGPTの回答ここまで ーーーーー
ChatGPTも、なかなか語りますね。