Parabasvat Δημοσ. 3 Δεκεμβρίου 2012 Δημοσ. 3 Δεκεμβρίου 2012 Χαιρετώ. Έχω φτιάξει ένα απλό πρόγραμμα με posix threads, είναι γραμμένο σε C και το έκανα compile σε linux με την χρήση του gcc. Η λειτουργία του είναι η εξής: Δημιουργούναι 20 νήματα τα οποία μπορούν να κατηγοριοποιηθούν σε Α) Κανονικά νήματα (εκτελούν ένα loop και τερματίζουν), Β)Ευγενικά νήματα (παραχωρούν τη cpu σε κάποιο άλλο νήμα) και Γ) Κακά νήματα (επιλέγουν τυχαία ένα από τα υπόλοιπα νήματα, διαγράφουν τα χαρακτηριστικά τους και τα τερματίζουν). Η απορία μου είναι η εξής: Στη συνάρτηση BadThread() όταν γίνετε κλήση της pthread_cancel() για να ακυρωθεί ένα συγκεκριμένο νήμα τότε μου παρουσιάζεται σφάλμα "Segmentation fault". Τι λάθη έχω κάνει; *Είμαι αρχάριος στον προγραμματισμό και ο λόγος που έγραψα τον κώδικα είναι για μία εργασία. Κώδικας: #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #define NUM_THREADS 20 void *NormalThread(void *threadid) /*Normal thread*/ { . . . . pthread_exit(NULL); . . . } void *GentleThread(void *threadid) /*Gentle thread*/ { . . pthread_yield(); //Release cpu . . } void *BadThread(void *threadid) /*Bad thread*/ { long tid3; int timer3; int c; long tnd; int pthread_t; int rc; tid3 = (long)threadid; timer3= 10+ (rand() % 11); /*Thread delay*/ tnd=rand() % tid3; rc = pthread_cancel(tnd);//??? segmentation fault if(rc) printf("failed to cancel the thread\n");//??? int pthread_attr_destroy(pthread_attr_t *tnd); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; int ThreadKind; srand(time(NULL)); /*Random numbers after compile again*/ printf("\n"); printf("Press ENTER to start creating threads...\n"); getchar(); for(t=0;t<NUM_THREADS;t++){ /*Check what kind of thread will be created*/ ThreadKind=(rand() & 101); if (ThreadKind<60){ rc = pthread_create(&threads[t], NULL, NormalThread,(void *)t); } if (ThreadKind>=60 && ThreadKind<80){ rc = pthread_create(&threads[t], NULL, BadThread, (void *)t); } if (ThreadKind>=80 && ThreadKind<100){ rc = pthread_create(&threads[t], NULL, GentleThread, (void *)t); } pthread_exit(NULL); }
gdelaportas Δημοσ. 3 Δεκεμβρίου 2012 Δημοσ. 3 Δεκεμβρίου 2012 (επεξεργασμένο) rc = pthread_cancel(tnd); long tnd; Δεν ακυρώνεις ένα thread τύπου pthread_t thr; αλλά ένα long!!! http://www.kernel.or...d_cancel.3.html Επεξ/σία 3 Δεκεμβρίου 2012 από gdelaportas
Parabasvat Δημοσ. 3 Δεκεμβρίου 2012 Μέλος Δημοσ. 3 Δεκεμβρίου 2012 Όντως.. Ευχαριστώ πολύ για την απάντηση.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα