私はモニターとミューテックスでランデスを実装しようとしていますが、実際には機能しません。あなたが私にこの問題を見るのを手伝ってくれることを願っていますここでは、コードです:スレッドランデブモニター
void traitement_principal(){
if(iRdv==NB_RDV){
iRdv=0;
continuer=1;
pthread_cond_signal(&autoContinuer);
}else{
continuer=0;
}
while(continuer!=1){
pthread_cond_wait(&autoContinuer,&emAffichage);
}
printf("Thread %lu, je finis mon traitement mon traitement \n",pthread_self());
}
void* traitement(){
pthread_mutex_lock (&emAffichage);//demande accès
printf("Thread %lu, je commence mon traitement \n",pthread_self());
iRdv+=1;
traitement_principal();
pthread_mutex_unlock (&emAffichage);//rend accès
pthread_exit((void *)NULL);
}
void thdErreur(int codeErr, char *msgErr, void *codeArret) {
fprintf(stderr, "%s: %d soit %s \n", msgErr, codeErr, strerror(codeErr));
pthread_exit(codeArret);
}
int main(int argc, char const *argv[]){
int etat;
pthread_t idThd[NB_THREADS];
for(int i = 0; i < NB_THREADS; i++){
if ((etat = pthread_create(&idThd[i], NULL, traitement,NULL)) != 0)
thdErreur(etat, "Creation thread avec rdv",NULL);
}
for (int i = 0; i < NB_THREADS; i++)
if ((etat = pthread_join(idThd[i], NULL)) != 0)
thdErreur(etat, "Join threads afficheurs", NULL);
printf ("\nFin de l'execution du thread principal \n");
return 0;
}
NB_RDV
は3
に展開されるマクロです。
は、0
に初期化されたファイルスコープ変数です。
continuer
は、0
に初期化されたファイルスコープ変数です。ここで
は、プログラムoputputの例である:
それは私が望んでいたものではありません。例えば、最初のもののために、私が取得したいと思い
あなたのコードの中で最も重要な問題はtraitement_principal()
通話
pthread_cond_signal()
iRdv
カウンタが
NB_RDV
に達したときにということであるように思われる
Thread 0 I start
Thread 1 I start
Thread 2 I start
Thread 0 I end
Thread 1 I end
Thread 2 I end
ログが英語であれば、コードを読む方がはるかに簡単です。 – Nebril
開始=開始/終了=終了 – Minirock
あなたが表示しているコードは不完全です。 – alk