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.
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
Downwoters: fair, fair, aber bitte nicht zu hart Ich bin müde :( –
EOF: einverstanden - es passiert für mich arbeiten, aber ich habe vor, es später zu beheben –