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

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

Δημοσ.

Χαιρετώ.

 

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

}

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

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

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

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

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

Σύνδεση

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

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