Προς το περιεχόμενο
  • 0
Parabasvat

Posix threads σε C - Απορία

Ερώτηση

Χαιρετώ.

 

Έχω φτιάξει ένα απλό πρόγραμμα με 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);

}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

2 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

  • 0
Δημοσ. (επεξεργασμένο)

rc = pthread_cancel(tnd);

 

long tnd;

 

Δεν ακυρώνεις ένα thread τύπου pthread_t thr;

αλλά ένα long!!!

 

:-)

 

http://www.kernel.or...d_cancel.3.html

Επεξ/σία από gdelaportas

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε έναν λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι εύκολο!

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
×
×
  • Δημιουργία νέου...

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.