Die folgende Funktion funktioniert nicht. pin_thread_function
erhalten manchmal Müll anstelle der Strukturdaten. Was ist falsch? Ich weiß, dass das ein grundsätzliches Problem ist, aber ich kann es nicht erklären.Wie übergeben Sie eine lokale Struktur als Parameter an pthread_create?
typedef void (*state_callback_t)(int state);
struct pin_thread_params
{
char pin[3 + 1];
state_callback_t callback_onchange;
};
extern int pin_monitor_create(const char * pin,
state_callback_t callback_onchange)
{
int ret;
unsigned long int thread;
struct pin_thread_params params;
//Setup struct
strcpy(params.pin, "123");
params.callback_onchange = callback_onchange;
//Create thread with struc as parameter
ret = pthread_create(&thread, NULL, pin_thread_function, ¶ms);
if (!ret)
{
ret = pthread_detach(thread);
}
return ret;
}
static void * pin_thread_function(void * context)
{
struct pin_thread_params params;
memcpy(¶ms, context, sizeof(params));
//Sometimes the correct string, most time garbage
printf("Started monitoring %s", params.pin);
}
Wenn params vor pthread_create malloc'ed ist alles in Ordnung, wie das funktioniert:
...
struct pin_thread_params * params;
//Setup struct with malloc
params = malloc(sizeof(struct pin_thread_params));
strcpy(params->pin, "123");
params->callback_onchange = callback_onchange;
...
Also 'params' ist verloren, gleich nach' pthread_create'. Ich war mir fast sicher, dass es erst am Ende der Funktion 'pin_monitor_create' verschwinden würde ... ;-(Fehle ich ein grundlegendes Scope-Konzept? – natenho
Nein, lies was er nochmal geschrieben hat. Es ist am Ende von' pin_monitor_create verschwunden '. –
@natenho Es ist nicht verloren nach' pthread_create', es ist verloren nach 'pin_monitor_create' Sie haben keine direkte Kontrolle über den Thread-Scheduler.Wenn der Haupt-Thread die Ausführung von' pin_thread_create' beendet, bevor der 'pin_thread_function'-Thread ausgeführt wird, haben Sie Wenn Sie Glück haben und der 'pin_thread_function'-Thread ausgeführt wird, bevor der Haupt-Thread fertig ist, sehen Sie Ihren String oder auf einem Multi-Core-Chip könnten die 2 Threads wirklich parallel laufen Sie müssen einige Methoden zur Thread-Synchronisierung verwenden. – yano