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