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

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


Parabasvat

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

Χαιρετώ.

 

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

}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

rc = pthread_cancel(tnd);

 

long tnd;

 

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

αλλά ένα long!!!

 

:-)

 

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

Επεξ/σία από gdelaportas
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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