Übergeben von Strukturen als Argumente bei Verwendung von pthread_create()

Lesezeit: 5 Minuten

skinderneaths Benutzeravatar
Haut darunter

Ich habe versucht, während der Verwendung eine Struktur als viertes Argument zu übergeben pthread_create() mit sowas:

pthread_create(&tid1, NULL, calca, &t); //t is the struct

Wenn ich jetzt versuche, auf Variablen in der Struktur zuzugreifen – ta, tb oder tc -, erhalte ich immer wieder eine Fehlermeldung – Anfrage für ein Mitglied in etwas, das keine Struktur oder Union ist.

Welche alternative Methode könnte ich verwenden, um Strukturen an den Thread zu übergeben?

Benutzeravatar von Lyndsey Ferguson
Lyndsey Ferguson

Wahrscheinlich erstellen Sie die Struktur im selben Bereich wie pthread_create. Diese Struktur ist nicht mehr gültig, sobald dieser Bereich verlassen wird.

Versuchen Sie, einen Zeiger auf die Struktur auf dem Heap zu erstellen, und übergeben Sie diesen Strukturzeiger an Ihren Thread. Vergessen Sie nicht, diese Erinnerung irgendwo zu löschen (im Thread, wenn Sie sie nie wieder verwenden werden – oder wenn Sie sie nicht mehr benötigen).

Wie Cyberconte bereits erwähnt hat, müssen Sie den Zugriff darauf mit einem Mutex oder einem kritischen Abschnitt sperren, wenn Sie von verschiedenen Threads aus auf diese Daten zugreifen.

Bearbeiten 14. Mai 2009 @ 12:19 Uhr EST: Außerdem müssen Sie, wie andere Leute bereits erwähnt haben, Ihren Parameter in den richtigen Typ umwandeln.

Wenn Sie eine Variable übergeben, die eine globale Struktur ist (auf der Sie zu bestehen scheinen), muss Ihre Thread-Funktion in den Typ umgewandelt werden:

void my_thread_func(void* arg){
    my_struct foo = *((my_struct*)(arg)); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}

Oder, wenn Sie einen Zeiger auf Ihre Struktur übergeben:

void my_thread_func(void* arg){
    my_struct* foo = (my_struct*)arg; /* Cast the void* to our struct type */
    /* Access foo->a, foo->b, foo->c, etc. here */
}

  • Eigentlich habe ich den Thread in der Hauptfunktion erstellt und die Struktur direkt nach dem Einbinden der Header-Dateien erstellt. Es sollte also für alle Funktionen zugänglich sein (korrigieren Sie mich, wenn ich falsch liege).

    – Haut

    14. Mai 2009 um 16:19 Uhr

  • Ihre letzte Änderung war bisher der nützlichste Beitrag hier. Vielen Dank.

    – Haut

    14. Mai 2009 um 16:31 Uhr

  • Danke, das hat meinen Speck gerettet.

    Benutzer67416

    14. März 2013 um 19:15 Uhr

  • Speck ist es wert, aufbewahrt zu werden.

    – Lyndsey Ferguson

    25. Februar 2021 um 18:28 Uhr

Wenn Sie sich in Ihrer Thread-Funktion befinden, ist das übergebene Argument ein void*. Sie müssen es in eine Struktur umwandeln, bevor Sie es als solches verwenden können.

void my_thread_func(void* arg){
    my_struct foo = (my_struct)(*arg); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}

  • Ich habe das getan, aber jetzt bekomme ich einen Fehler “Dereferenzierung des Zeigers ‘void *'”.

    – Haut

    14. Mai 2009 um 15:56 Uhr

  • Harper wollte schreiben: my_struct foo = *(my_struct *)arg; oder my_struct *foo = (my_struct *)arg;

    – Jonathan Leffler

    14. Mai 2009 um 16:32 Uhr

  • Benutzte diese Idee und Lyndsey Fergusons Bearbeitung gepostet – 14. Mai 2009 @ 12:19 Uhr EST.

    – Haut

    14. Mai 2009 um 16:33 Uhr

  • Ja, Casts im C-Stil sind nicht meine Stärke, und es ist ein paar Jahre her, seit ich pthread_create verwendet habe. Ich bevorzuge C++ und eine gute Threading-Bibliothek.

    – Harper Shelby

    14. Mai 2009 um 18:23 Uhr

  1. Erstellen Sie eine Semaphore

  2. Erstellen Sie eine weitere Struktur, die aus einem Zeiger auf Ihre Struktur und dem Semaphor-Handle besteht

  3. Übergeben Sie einen Zeiger auf diese neue Struktur an pthread_create

  4. Warten Sie im übergeordneten Thread, dh dem namens pthread_create, auf das Semaphor

  5. Kopieren Sie im untergeordneten Thread Mitglieder Ihrer Struktur in lokale Variablen oder speichern Sie sie an anderer Stelle

  6. Signalisieren Sie im untergeordneten Thread das Semaphor

  7. Schließen Sie im übergeordneten Thread die Semaphore

Sie könnten einen gemeinsam genutzten Speicher oder eine globale Variable verwenden (wenn nichts anderes dieses Argument benötigt) oder eine verknüpfte Liste, wenn es sich um Threads handelt, die von Daten gespeist werden.

Denken Sie nur daran, Ihre Variablen zu sperren, die Thread-geteilt werden.

Ohne den tatsächlichen beleidigenden Code kann ich Ihnen jedoch nicht sagen, was Sie in Ihrer aktuellen Implementierung falsch machen.

Diese Fehlermeldung bedeutet, dass Sie den Zeiger nicht dereferenzieren.

Du sagst “ta” statt “t->a”

[[email protected] ~]$ cat testitx.c
struct x {
        int a, b;
};

int main(int argc, char *argv[])
{
        struct x y, *z;

        z = &y;
        z.a = 10;
}
[[email protected] ~]$ cc -c testitx.c
testitx.c: In function `main':
testitx.c:10: error: request for member `a' in something not a structure or union
[[email protected] ~]$

  • Hilft nicht. Ich habe die Lösung von Harper Shelby verwendet, um einen Fehler “Dereferenzierung des Zeigers ‘void *'” zu erhalten.

    – Haut

    14. Mai 2009 um 16:17 Uhr

Benutzeravatar von Marc Bernier
Marc Bernier

Früher habe ich oft die gleichen Fehler gemacht, die in den anderen Antworten aufgeführt sind, aber jetzt verfolge ich einen etwas anderen Ansatz, der das Fehlerpotenzial von der Threading-Funktion auf den Aufruf von pthread_create verlagert.

Ich deklariere und definiere die Threading-Funktion auf “normale” Weise:

void *ThreadFunction(sPARAMETERS *Params) {

  // do my threading stuff...

}

und wenn ich pthread_create aufrufe, muss ich eine Umwandlung verwenden:

pthread_create(&ThreadId,0,(void*(*)(void*)) &ThreadFunction,&Params);

Ich vergesse fast nie, das & für die Params zu verwenden, und der Compiler kümmert sich um alle Fehler, die ich am anderen Ende mache. Funktioniert auch hervorragend für Rückrufe.

  • Hilft nicht. Ich habe die Lösung von Harper Shelby verwendet, um einen Fehler “Dereferenzierung des Zeigers ‘void *'” zu erhalten.

    – Haut

    14. Mai 2009 um 16:17 Uhr

Benutzeravatar von user3512266
Benutzer3512266

my_struct foo = (my_struct)(*arg); ist incoreect try my_struct *foo = (my_struct *)(arg);
UND, int die Funktion, die den Thread aufruft, stellen Sie sicher, dass es statisch ist (damit der Speicher, auf den gezeigt wird, nicht im Nebel verloren geht)

1433230cookie-checkÜbergeben von Strukturen als Argumente bei Verwendung von pthread_create()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy