Pthread_signal passaggio di parametri non corretto

di Anonimizzato8536 il
2 risposte

static void *myfun (void *arg){
	int exitvalue = 17;	
	pthread_exit(&exitvalue);
}
int main (void) {
	int i,status;
	pthread tid[N];
	void *ret;
	for(i = 0; i < N; i++)
		pthread_create(&tid[i], NULL, &myfun, &i);
	
	for(i = 0; i < N; i++){	
		pthread_join(tid[i], &ret);
		status = *(int *) ret;
		printf("Thread #%d ends: %d status\n",i,status);
	}
Per N = 10 mi da questo output
Thread #0 ends: 1 status
Thread #1 ends: 1 status
Thread #2 ends: 1582507208 status
Thread #3 ends: 1 status
Thread #4 ends: 1 status
Thread #5 ends: 1 status
Thread #6 ends: 1582507208 status
Thread #7 ends: 1582507208 status
Thread #8 ends: 1 status
Thread #9 ends: 1 status
Ma gli status dovrebbero essere tutti 17.

2 Risposte

  • Vale il discorso sul post precedente, in più non puoi restituire un addr di una variabile definita localmente nella myfun. Ti Allego un esempio funzionante:
    
    #include <pthread.h>
    #include <stdio.h>
    
    #define MAXTHREADS 20
    
    struct thread_info 
    {
      pthread_t id;
      int my_id;
      int valore;
    };
    
    static void *myfun (void *arg){
       
       struct thread_info *ps=(struct thread_info *) arg;
       int *exitvalue; 
       
       exitvalue=&ps->valore;
       printf ("Thread #%d START with val=%d\n",ps->my_id,*exitvalue);
       
       pthread_exit(exitvalue);
    }
    
    int main (void) {
       int i,status;
       struct thread_info tinfo[MAXTHREADS];
       
       void *ret;
       for(i = 0; i < MAXTHREADS; i++)
       {
         tinfo[i].my_id=i;
         tinfo[i].valore=i*10;
         pthread_create(&tinfo[i].id, NULL, &myfun, &tinfo[i]);
       }
      
       for(i = 0; i < MAXTHREADS; i++){   
          pthread_join(tinfo[i].id, &ret);
          status = *(int *) ret;
          printf("Thread #%d ends: %d status\n",i,status);
       }
       
       return 0;
    }
    
  • Grazie!!!
    ho capito veramente un sacco di cose grazie hai tuoi due esempi.
Devi accedere o registrarti per scrivere nel forum
2 risposte