» »

[c] napake pri castanju

[c] napake pri castanju

napsy ::

Pišem en program kjer en thread poda drugemu preku asinhrone čakalne vrste strukturo. Sta pa dve podobni strukturi. Druga ima na začetku kazalec na prvo, tako da če bi želel dostopati samo do elementov prve, naj bi samo castal. In to tudi naredim, saj drugi thread, ki sprejme strukturo v obliki prve (torej castano), dobi napačne vrednosti. Zakaj?

#include <gtk/gtk.h>

GAsyncQueue *queue;

struct s1 {
	int a, b, c;
};

struct s2 {
	struct s1 *s1_ptr;
	int d, e, f;
};


int ptr_funk1(struct s1 *ptr)
{
	ptr->a = 4;
}

gpointer funk1(gpointer data)
{
	struct s1 *ptr_s1 = g_malloc(sizeof(*ptr_s1));
	struct s2 *ptr = g_malloc(sizeof(*ptr));
	ptr_s1->a = 2;
	ptr->s1_ptr = ptr_s1;
	ptr->d = ptr->e = 8;

	g_async_queue_push(queue, (struct s1 *)ptr);
	return NULL;
}

gpointer funk2(gpointer data)
{
	struct s1 *ptr;

	ptr = (struct s1 *)g_async_queue_pop(queue);
	g_print("s1 ptr = %d\n", ptr->a);
	ptr_funk1(ptr);
	 g_print("s1 ptr = %d\n", ptr->a);
	return NULL;
}

int main(int argc, char **argv)
{
	GThread *thread1, *thread2;
	g_thread_init(NULL);
	gtk_init(&argc, &argv);

	queue = g_async_queue_new();
	thread1 = g_thread_create(funk1, NULL, FALSE, NULL);
	thread2 = g_thread_create(funk2, NULL, FALSE, NULL);

	gtk_main();
	return 0;
}


Če program poženem, dobim:
./test
s1 ptr = 134676568
s1 ptr = 4

In je jasno vidno, da je prvi izpis vrednosti a napačen, saj bi moral biti 2.
"If you die, you die. But when you live you live. There is no time to waste."
  • spremenil: napsy ()

napsy ::

Ok rešu problem z dvojnim kazalcem.
"If you die, you die. But when you live you live. There is no time to waste."


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

"Dinamicna" sprememba razreda v C++

Oddelek: Programiranje
131941 (1333) Spura
»

[C] Razbitje stringa s pomočjo indeksov

Oddelek: Programiranje
5838 (716) Shinobi
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112150 (2025) Zzzzzzz
»

spet problem v Cju ... kazalci

Oddelek: Programiranje
61055 (969) hatch
»

Collision detection

Oddelek: Programiranje
81942 (1694) Senitel

Več podobnih tem