私は1人のエレベーターと1人の人がそれぞれ独自のスレッドとエレベーターを持つようにシミュレートするマルチスレッドプログラムを作成中です。私は最初の段階にあり、作成されたスレッドを取得し、正常に動作することを確認しようとしています。forループを使用して多数のスレッドを作成するときの奇妙な動作
私はforループで初期化しようとしているperson_threads
というpthreadの配列を持っています。ループ内でスレッド番号のメッセージを送信してスレッド内に出力しています。何らかの理由で私は奇妙な振る舞いをしています。forループがいくつかのスレッドを作成する前に適切に反復していないのとほぼ同じです(ループと出力を参照)。この動作はランダムであり、実行ごとにさまざまです。スレッドを正しく作成するためには何が必要なのかよくわかりません。この問題を引き起こしている可能性のあることについて洞察があれば、助けてください。複数の7S、15S、12S、48Sとがあるか
コード
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define MAX_PERSONS 49
void *person(void *myvar);
void *elevator(void *myvar);
int main(int argc, char *argv[]){
pthread_t elevator_thread;
pthread_t person_threads[MAX_PERSONS]; //My array of threads
char *elev_msg = "Elevator thread started";
pthread_create(&elevator_thread, NULL, elevator, (void *) elev_msg);
//Here is where I try to initialize messages and threads,
//see Persons function and output
for (int i = 0; i < MAX_PERSONS; i++){
char msg[50];
snprintf(msg, sizeof msg, "Person thread %d started", i);
pthread_create(&person_threads[i], NULL, person, (void *) msg);
}
printf("Main function after pthread_creates\n");
pthread_join(elevator_thread, NULL);
for (int i = 0; i < MAX_PERSONS; i++){
pthread_join(person_threads[i], NULL);
}
return 0;
}
void *person(void *myvar){
char *msg;
msg = (char *) myvar;
printf("%s\n", msg);
return NULL;
}
void *elevator(void *myvar){
char *msg;
msg = (char *) myvar;
printf("%s\n", msg);
return NULL;
}
出力
[email protected]:~/Documents/OS-Project2$ ./elevator
Elevator thread started
Person thread 7 started
Person thread 7 started
Person thread 7 started
Person thread 7 started
Person thread 7 started
Person thread 7 started
Person thread 7 started
Person thread 8 started
Person thread 9 started
Person thread 10 started
Person thread 12 started
Person thread 12 started
Person thread 14 started
Person thread 15 started
Person thread 15 started
Person thread 16 started
Person thread 17 started
Person thread 18 started
Person thread 19 started
Person thread 20 started
Person thread 21 started
Person thread 22 started
Person thread 23 started
Person thread 24 started
Person thread 25 started
Person thread 26 started
Person thread 27 started
Person thread 28 started
Person thread 29 started
Person thread 30 started
Person thread 31 started
Person thread 32 started
Person thread 33 started
Person thread 34 started
Person thread 35 started
Person thread 36 started
Person thread 37 started
Person thread 38 started
Person thread 39 started
Person thread 40 started
Person thread 41 started
Person thread 42 started
Person thread 43 started
Person thread 44 started
Person thread 45 started
Person thread 46 started
Person thread 47 started
Person thread 48 started
Main function after pthread_creates
Person thread 48 started
注意してください。この動作は、実行ごとにランダムです。私はそれが実際には常に50スレッドを作成することに気づいたが、私は配列を正しく初期化する必要があります。どんな助けもありがとう。ここで
I'LL @alkを編集を終了しますが、意図的に 'msg'宣言を太字にしています。テキストをコードとしてマークすると太字にすることはできないようですので、インデントしません。 –
私はこれをあなたの意図ではないと思いました。だから私の変更を元に戻してください。あるいは、この行にCのコメントを追加するだけですか? – alk