2017-11-14 4 views
-1

Ich bin ziemlich verwirrt, warum mein Programm nicht wie vorgesehen funktioniert.Thread funktioniert nicht wie vorgesehen

Ich habe drei ähnliche Funktion:

static void *L1(void *ptr) 
{ 
    char *text = (char *)ptr; 
    int ret; 
    int fd = open("/dev/L1", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM 
} 

static void *L2(void *ptr) 
{ 
    char *text = (char *)ptr; 
    int ret; 
    int fd = open("/dev/L2", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM 
} 

static void *L3(void *ptr) 
{ 
    char *text = (char *)ptr; 
    int ret; 
    int fd = open("/dev/L3", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM 
} 

Next Ich habe eine Funktion Thread für die Erstellung von:

static void createKThread(void* (*a)(void *), void* (*b)(void *), void* (*c)(void *)) 

{ 
    pthread_t t1, t2, t3; 
    int T1, T2, T3; 

    T1 = pthread_create(&t1, NULL, a, NULL); 
    T2 = pthread_create(&t2, NULL, b, NULL); 
    T3 = pthread_create(&td3, NULL, c, NULL); 

    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 
    pthread_join(t3, NULL); 

} 

In meinem Haupt ich tue:

 int main(){ 

    Send2[0] = 'a'; 
    createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //First 

    Send2[0] = 'b'; 
    createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //Second 
    return 0; 
    } 

Mein Hauptprogramm endet nach Abschluss des ersten Funktionsaufrufs `createKThread'. Ich kann nicht herausfinden warum, ich möchte, dass der zweite Funktionsaufruf funktioniert und ich möchte mehr Code zu meinem Hauptprogramm hinzufügen. Bitte rate mir, was ich falsch mache.

+2

Weil es segfaults ... Sie müssen einen Funktionszeiger 'L1' übergeben, nicht den Rückgabewert des Aufrufs' L1 (& Send [0]); ' – Ctx

+0

Die Tatsache, dass Sie nicht einmal' int main verwenden 'schlägt vor, dass Sie nicht mit ** Warnungen aktiviert ** oder aufmerksam machen. –

+0

Obwohl, leider, GCC ist dumm genug, nicht zu diagnostizieren 'void *' nicht kompatibel mit Funktionszeiger ohne '-pedantic'. Yay POSIX:/ –

Antwort

0

Sie versauen Ihre Thread-Funktionen. Ich gehe davon aus, dass deine Funktionen L1 etc. als Thread-Funktionen laufen sollen.

static void *L1(void *ptr) 
{ 
    char *text = (char *)ptr; 
    int ret; 
    int fd = open("/dev/L1", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM 
} 

Ruft Ihr Compiler nicht über fehlenden Rückgabewert?

Wenn Sie Ihre Funktion erstellen rufen Sie die Rückgabewerte aus diesen Funktionen übergeben:

createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //First 

Anstatt die Adresse der Funktionen vorbei, können Sie sie nennen! Wenn sie einen zufälligen Wert zurückgeben, erstellen Sie Threads mit zufälligen Funktionsadressen.

+0

Hallo Gerhardh, der Compiler gibt mir überhaupt keinen Fehler. Ich habe versucht, das Problem für Stunden zu finden. Danke für deinen Rat. –

+0

Dann sollten Sie Warnungen aktivieren. Wie du immer tun solltest! Ein fehlender Rückgabewert für eine nicht void-Funktion und ein falscher Rückgabetyp für "main" sollten das Minimum an Warnungen sein, die Sie erhalten sollten. Auch falsche Parametertypen für 'createKThread' sollten eine Warnung anzeigen – Gerhardh

0

hier:

createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //First 

Ihr Argument L1(&Send[0]) wird durch den Aufruf L1 mit Parametern &Send[0] ausgewertet. Das ist nicht was du willst. Sie wollen separat die Funktionszeiger L1 und das Argument zu übergeben, d.h .:

createKThread(L1, &Send[0], L2, &Send[0], L3, &Send[0]); 

mit

static void createKThread(void* (*a)(void *), void *aarg, 
          void* (*b)(void *), void *barg, 
          void* (*c)(void *), void *carg) { 
    ... 
    T1 = pthread_create(&t1, NULL, a, aarg); 
    ... 
} 

usw. Dann sollte es funktionieren wie erwartet.

Als eine Randnotiz: Sie sollten auf Crash-Nachrichten (d. H. "Segmentierung Fehler") oder Compiler-Warnungen (alle aktivieren!) Beim Debuggen eines Problems achten.

Verwandte Themen