こぼれネット

「なんでC言語のスレッドとする関数の引数は構造体渡しにしなければならないのでしょうか?」とChatGPTに泣き言を言ってみた件

「なんでC言語のスレッドとする関数の引数は、構造体渡しにしなければならないのでしょうか?」と泣き言を言ってみました。

すでに他のサブシステムでがんじがらめになったCのプログラムでは、トレースが使えないので、デバッグはログに吐き出しながらの作業になります。

これが、結構な地獄で、つい先刻、改造したスレッドの稼動を確認できたのですが、愚痴がいいたくなりました(例えば、GO言語のGoroutineなんか、めちゃくちゃ簡単にスレッド作れる)。

ーーーーー ChatGPTの回答ここから ーーーーー

C言語のスレッド関数 (pthread_create() で実行する関数) の引数として 構造体を渡すのが一般的 なのは、以下の 4つの理由 によります。


1. pthread_create() の仕様

pthread_create() のスレッド関数(スレッドのエントリポイント)には、単一の void* 型の引数 を受け取る関数を渡す必要があります。

pthread_create() のプロトタイプ

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);

つまり、スレッドに複数のデータを渡したい場合、
1つの void* にまとめる必要がある構造体で渡すのが一般的 ということになります。


2. 複数のデータを渡したい

スレッド関数で処理するのに 複数の引数(変数)を渡したい ことがよくあります。

例えば:

void *my_thread_func(void *arg) {
int *num = (int *)arg;
printf("Received number: %d\n", *num);
return NULL;
}

では、int の値しか渡せません。

もし 複数の値を渡したい場合

typedef struct {
int id;
double value;
} ThreadArgs;
void *my_thread_func(void *arg) {
ThreadArgs *args = (ThreadArgs *)arg;
printf("ID: %d, Value: %f\n", args->id, args->value);
return NULL;
}

このように、構造体を使えば複数の値をまとめて渡せる ので便利です。


3. スレッドの実行中に変数が消えないようにする

スレッド関数に渡す引数は、スレッドが終了するまで有効 でなければなりません。

例えば:

int num = 42;
pthread_create(&thread, NULL, my_thread_func, &num);

この場合、もし num がローカル変数で main() の実行が終了すると、
そのメモリが解放されてしまい、スレッド関数内で num を使うと 未定義動作 になります。

解決策

ThreadArgs *args = malloc(sizeof(ThreadArgs));
args->id = 1;
args->value = 3.14;
pthread_create(&thread, NULL, my_thread_func, (void *)args);

こうすれば、スレッドが終了するまで args は有効になります。


4. スレッドごとに異なるデータを渡せる

スレッドを複数作成する場合、それぞれ異なるデータを渡すことが多い。

例えば、複数のスレッドに異なる ID を渡す場合:

ThreadArgs args[3];

for (int i = 0; i < 3; i++) {
args[i].id = i;
args[i].value = i * 1.1;
pthread_create(&threads[i], NULL, my_thread_func, &args[i]);
}

構造体なら、スレッドごとに異なるデータを安全に管理できる


結論

C言語のスレッドの引数は、構造体を渡すのが基本になる

ーーーーー ChatGPTの回答ここまで ーーーーー

まあ、そりゃそうなんだろうけどさ(そして、私としても、今さら仕様を変えられても困るんだけどさ)。でも構造体の引数に構造体が入ってくる場合、ポインタの記載方法で大混乱するんだよね。スレッド内部で構造体の分解も必要になるし。

-----

ところで、今なお、「プログラマーが好むプログラム言語」などという見出しの記事が散見されます。

開発するソフトウェアの内容によって、選ばれるプログラム言語は変ります。

ダムの掘削するのに「シャベル」を選ぶことはできませんし、家庭菜園をするのに「シャベルカー」を持ち込むことはできません。

プロのプログラマーなら、「シャベル」も「シャベルカー」も使えなければなりません。必要なら新しいプログラム言語を勉強して、仕事をしなければならないんです。

「プログラマーが好むプログラム言語」という考え方が、一体どこからやってくるのか、私は今でも分からないです。

「プログラマーが好むプログラム言語」などという、アホな内容の記事が散見されるのは何故でしょうか。見解を聞かせて下さい

ーーーーー ChatGPTの回答ここから ーーーーー

「プログラマーが好むプログラム言語」系の記事が散見される理由は、以下のような要因が考えられます。

  1. 簡単にウケるネタだから
    プログラム言語の人気ランキングや「初心者向け」「稼げる言語」といったテーマは、プログラマーだけでなく、これから学ぼうとする人や経営層にも関心を持たれやすい。専門知識がなくても理解しやすいため、記事として書きやすく、アクセスを稼ぎやすい。

  2. 宗教戦争を煽ると盛り上がる
    プログラマーには、それぞれ慣れ親しんだ言語やこだわりがあるため、「○○言語が最強!」といった記事を出せば議論が活発になり、SNSや掲示板で拡散される。結果として、PV(ページビュー)やエンゲージメントが向上し、メディア側の利益につながる。

  3. 技術を知らない人でも書けるから
    プログラミングの実務に詳しくないライターでも、「流行りの言語ランキング」「人気の言語トップ10」といった記事なら、調査や寄せ集めで簡単に書ける。しかも、明確な正解がないため、適当にデータを並べるだけでも成立する。

  4. 初心者や未経験者向けの情報が求められている
    現場のエンジニアにとっては無意味な話でも、これからプログラミングを学ぼうとする人には「どの言語を学べばいいか」という関心がある。需要がある以上、供給され続ける。

  5. 技術選定の本質を理解していない層が多い
    本来、プログラム言語は開発するソフトウェアの要件や環境、チームのスキルセットに応じて選ばれるべきもの。しかし、「言語そのものの優劣」や「人気」だけで語ろうとする風潮が根強く、それに迎合した記事が多くなる。

結局のところ、**「簡単に書けて、簡単にウケて、簡単に拡散される」**から、この手の記事が量産されるわけです。

ーーーーー ChatGPTの回答ここまで ーーーーー

ChatGPTも、なかなか語りますね。

 

モバイルバージョンを終了