Ich muss mehrere Argumente an eine Funktion übergeben, die ich in einem separaten Thread aufrufen möchte. Ich habe gelesen, dass der typische Weg, dies zu tun, darin besteht, eine Struktur zu definieren, der Funktion einen Zeiger darauf zu übergeben und sie für die Argumente zu dereferenzieren. Ich kann dies jedoch nicht zum Laufen bringen:
#include <stdio.h>
#include <pthread.h>
struct arg_struct {
int arg1;
int arg2;
};
void *print_the_arguments(void *arguments)
{
struct arg_struct *args = (struct arg_struct *)args;
printf("%d\n", args -> arg1);
printf("%d\n", args -> arg2);
pthread_exit(NULL);
return NULL;
}
int main()
{
pthread_t some_thread;
struct arg_struct args;
args.arg1 = 5;
args.arg2 = 7;
if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
printf("Uh-oh!\n");
return -1;
}
return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}
Die Ausgabe hierfür sollte sein:
5
7
Aber wenn ich es laufen lasse, bekomme ich tatsächlich:
141921115
-1947974263
Weiß jemand was ich falsch mache?
Antworten:
Denn du sagst
struct arg_struct *args = (struct arg_struct *)args;
anstatt
struct arg_struct *args = arguments;
quelle
verwenden
anstelle von
quelle
main()
hat seine eigenen Thread- und Stack-Variablen. Ordnen Sie entweder Speicher für 'args' im Heap zu oder machen Sie ihn global:Dann ändern Sie natürlich die Referenzen von
args->arg1
zuargs.arg1
etc ..quelle
Verwenden:
Und übergeben Sie diese Argumente wie folgt:
Vergiss die freien Argumente nicht! ;)
quelle
Die Argumente von print_the_arguments sind Argumente, daher sollten Sie Folgendes verwenden:
quelle
-> Diese Zuordnung ist falsch, ich meine, das variable Argument sollte in diesem Zusammenhang verwendet werden. Prost!!!
quelle
Bei der Thread-Erstellung dieses Codes wird die Adresse eines Funktionszeigers übergeben. Das Original
pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0
Es sollte lauten wie
pthread_create(&some_thread, NULL, print_the_arguments, (void *) &args)
Eine gute Möglichkeit, sich daran zu erinnern, ist, dass alle Argumente dieser Funktion Adressen sein sollten.
some_thread
wird statisch deklariert, sodass die Adresse ordnungsgemäß mit gesendet wird&
.Ich würde eine
pthread_attr_t
Variable erstellen , sie dann verwendenpthread_attr_init()
und die Adresse dieser Variablen übergeben. Das Übergeben einesNULL
Zeigers ist jedoch ebenfalls gültig.Das
&
vor dem Funktionsetikett liegende Problem verursacht hier das Problem. Das verwendete Label ist bereits einevoid*
Funktion, daher ist nur das Label erforderlich.!= 0
Mit dem letzten Argument zu sagen, scheint unbestimmtes Verhalten zu verursachen. Wenn Sie dies hinzufügen, wird anstelle einer Referenz ein Boolescher Wert übergeben.Die Antwort von Akash Agrawal ist auch Teil der Lösung des Problems dieses Codes.
quelle