2016-03-20 7 views
-1

Ich beginne einen Thread und übergeben Sie eine Struktur, die einige Werte initialisiert hatte, zu ihrem Einstiegspunkt. Der Zeiger, den ich bekomme, ist korrekt, und ich kann den Zeiger auf ein bestimmtes Feld in dieser Struktur bringen, aber der Wert, den ich dort sehe, ist nicht das, was ich ursprünglich festgelegt habe. Wie ist das passiert?C - Felder in der Struktur zwischen den Threads

Beispiel:

typedef int (*CNX_Algorithm)(void*, int); 

typedef struct 
{ 
    CNX_Algorithm algorithm; 
    thrd_t thread; 
    void *data; 
    int go; 
} CNX_Instance; 

int RunContinuously(void *instance) 
{ 
    int count = 0; 
    int *go = &((CNX_Instance*)instance)->go; 
    CNX_Algorithm algorithm = ((CNX_Instance*)instance)->algorithm; 
    void *data = ((CNX_Instance*)instance)->data; 
    printf("new thread: %p %p %p\n", instance, &((CNX_Instance*)instance)->data, data); 
    while(*go) count += algorithm(data, 1); 
    return count; 
} 

CNX_Instance *CNX_StartInstance(CNX_Algorithm algorithm, void *data) 
{ 
    CNX_Instance *instance = malloc(sizeof(CNX_Algorithm)); 
    instance->algorithm = algorithm; 
    instance->data = data; 
    printf("original thread: %p %p %p\n", instance, &instance->data, instance->data); 
    instance->go = 1; 
    thrd_create(&instance->thread, RunContinuously, instance); 
    return instance; 
} 

Output:

original thread: 024b1f78 024b1f84 0019ff10 
new thread: 024b1f78 024b1f84 80000008 

Huh ???

EDIT:

Ich sollte erwähnen, dass, wenn ich RunContinuously RUFEN stattdessen einen Thread gibt der Start es funktioniert wie erwartet. Stelle dir das vor.

+1

Sie haben wahrscheinlich ein Datenrace auf "go", das nicht atomar ist, und Sie überprüfen seinen Wert in einer Schleife, die es scheinbar nicht zu ändern scheint, ohne Synchronisation. Wenn Sie es asynchron in einem anderen Thread ändern, ist das Verhalten nicht definiert. – EOF

+0

Downwoters: fair, fair, aber bitte nicht zu hart Ich bin müde :( –

+0

EOF: einverstanden - es passiert für mich arbeiten, aber ich habe vor, es später zu beheben –

Antwort

1

Nun ein Problem, das ich sehe, ist, dass Sie die Größe eines CNX_Algorithm anstelle einer CNX_Instance mallocing sind. Der erste ist vier Bytes, während der zweite wahrscheinlich 16 oder mehr ist (auf 32-Bit-Systemen). Es könnte Speicherkorruption sein, wenn 4-Byte-Zuweisungen aus einem anderen Bucket kommen als beispielsweise 16-Byte-Zuweisungen.

+0

Oh wow ... Danke. –

+0

I ' Ich werde als Antwort akzeptieren, wenn es mir erlaubt. Ja, das hat das Problem gelöst. Dumm dumm blöder Fehler. –

+0

Ehrfürchtig. :) Sie lesen wahrscheinlich Heap-Block-Metadaten im neuen Thread oder etwas aus einer benachbarten Zuordnung. Froh, dass es geholfen hat! – itsokimbatman

Verwandte Themen