0
スレッドは私にとって新しいスレッドです。私はちょうどこのようなコードを試しましたスレッドが適切に機能しない
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
typedef struct{
sem_t *s;
int firstID;
int secondID;
} stadium;
void * game(void * currentData){
stadium * st = (stadium *)currentData;
sem_wait(st->s);
int first = st->firstID;
int second = st->secondID;
int o = rand();
int t = rand();
printf("%d Team %d:%d %d Team\n",first,o%100009,t%100009,second);
sem_post(st->s);
}
int main(){
for(int i= 1;i<=10;i++){
for(int j = i+1;j<=10;j++){
sem_t s ;
sem_t c;
sem_init(&s,0,4);
sem_init(&c,0,1);
pthread_t p;
stadium st;
st.firstID = i;
st.secondID = j;
st.s = &s;
st.counter = &c;
pthread_create(&p,NULL,game,&st);
}
}
pthread_exit(0);
return 0;
}
それはランダムに印刷されますが、どういうわけか同じペアを印刷します。同じペアを一度しか反復しないと、同じペアをどのように印刷できますか?
。これは、セマフォの目的が、互いに同期していないことを意味しています。また、セマフォーは 'for'ループの中で*宣言されているので、ループ終了後にスコープから外れます(スレッドはまだ実行されていない可能性があります)。最後に、あなたのメインスレッドは子スレッドが終了するのを待たずに、終了時にすべてのスレッドを終了させます。 – kaylum
'スタジアムst。これはスレッドに渡される自動変数でも、子スレッドが完了したか完了していない可能性があります。つまり、コードは未定義のビヘイビアとロジックエラーでいっぱいです。 – kaylum
@kaylumメインは実際に他のスレッドを終了させます。 – 2501