MauriDalia Δημοσ. 25 Νοεμβρίου 2008 Δημοσ. 25 Νοεμβρίου 2008 Γεια σας, Εχω δημιουργησει με την χρηση sockets εναν server και εναν client.Προκειμενου να υποστηρίζω παράλληλη επεξεργασια εχω βάλει νήματα.Στο προγραμμα του server για κάθε client που συνδέεται ,δημιουργείται και ένα νήμα.Η συνάρτηση accept είναι μέσα σε μια while μέσα στην οποία καλώ την pthread_create και την pthread_join Ομως, εστω οτι συνδεω τον πρώτο client.Τοτε αν παω να συνδεθω και μέσω ενος 2ου client αυτος μπλοκαρει πριν γίνει accepted και μπει στην while και όταν τελειωσει ο πρωτος τοτε συνδεεται. Κανονικα ομως δεν πρεπει να τρέχουνε παραλληλα τα νήματα? Ευχαριστω > while(1) { printf("Server waiting for connections\n"); ns=accepting(sd,sockaddr,addrlen); //Kaloume ti sunarthsh accepting h opoiaapodexetai gia connect twn clients //pou briskontai stin oura anamonis printf("Accepted...\n"); bzero(buf,sizeof(buf)); /* Initialize and set thread detached attribute */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); t++; //Auksanw to id tou nhmatos printf("Creating thread %d\n", t); rc = pthread_create(&threads[t],&attr, thread_function,(void *)& arg[t]); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } /* Free attribute and wait for the other threads */ pthread_attr_destroy(&attr); rc = pthread_join(threads[t], &status); if (rc) { printf("ERROR; return code from pthread_join() is %d\n", rc); exit(-1); } printf("Completed join with thread %d status= %ld\n",t, status); close(ns); }
dop Δημοσ. 26 Νοεμβρίου 2008 Δημοσ. 26 Νοεμβρίου 2008 Η join περιμένει το thread να τελειώσει την εκτέλεση της συνάρτησης που του έδωσες. Βασικά πρέπει να μαζεψεις όλα τα thread_ids και να κάνεις join έξω από το loop.
swcratis Δημοσ. 26 Νοεμβρίου 2008 Δημοσ. 26 Νοεμβρίου 2008 Η join περιμένει το thread να τελειώσει την εκτέλεση της συνάρτησης που του έδωσες. Βασικά πρέπει να μαζεψεις όλα τα thread_ids και να κάνεις join έξω από το loop. Τα threadids πρεπει να τα παιρνω με την pthread_self και να τα αποθηκευω σε εναν πινακα pthread_t threads[NUM_THREADS] και το πρωτο ορισμα της join τι θα ειναι?Πρεπει να βαλω καπου και αυτη threads[t]=pthread_self(void);
dop Δημοσ. 26 Νοεμβρίου 2008 Δημοσ. 26 Νοεμβρίου 2008 Όπως το κάνεις παραπάνω: > rc = pthread_join(threads[t], &status); Μόνον τον πίνακα threads χρειάζεσαι.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.