[Jderobot] Fwd: Re: problema con C++

Alberto Martin almartinflorido en gmail.com
Jue Jul 31 16:08:18 CEST 2014


---------- Mensaje reenviado ----------
De: "Alberto Martin" <almartinflorido en gmail.com>
Fecha: 29/07/2014 19:56
Asunto: Re: [Jderobot] problema con C++
Para: <jderobot en gsyc.es>
Cc:

Buenas Laura,

según parece el problema que tienes es que estás declarando un array de
estructuras estáticas. Cuando creas un hilo éste hace una "instantánea" de
la memoria del hilo que lo creo (el padre), así, si el padre tiene una
array de estructuras estáticas sus hijos tendrán el mismo array con los
mismos valores pero serán copias locales, es decir, si un hijo modifica
algún valor solo lo verá en su espacio de memoria y el resto seguirá con
los datos que tuvieran anteriormente. Para solucionar esto tienes que
utilizar punteros, de este modo creas un array de punteros de estructuras ,
como un puntero es una dirección de memoria todos los hijos podrán acceder
a la misma parte de la memoria a leer/modificar el mismo dato. En [1] te
dejo un post de stackoverflow con un problema parecido al tuyo, en [2] un
ejemplo de punteros a estructuras y en [3] un pequeño tutorial de
concurrencia en C++, te vendrá bien para ver como acceder a datos
compartidos de manera segura utilizando semáforos.

Espero que te sirva de ayuda.

Un saludo

[1]:
http://stackoverflow.com/questions/11352249/memory-sharing-between-c-threads
[2]: http://cplus.about.com/od/learningc/ss/pointers_6.htm
[3]:
http://baptiste-wicht.com/posts/2012/03/cpp11-concurrency-part1-start-threads.html



2014-07-29 18:33 GMT+02:00 Laura Martín Ramírez <lmr92 en hotmail.es>:

>  Hola a todos,
>
> Estoy desarrollando la herramienta visual HFSM y tengo problema con C++.
> He hablado con JoseMaria y me ha comentado que estáis más duchos con C++ y
> podréis echarme una mano.
>
> Quiero declarar un array de structs y modificarlos desde distintos hilos.
> Para ello me declaro el struct de la siguiente manera:
>
>
>
>
> *struct item{    std::string name;     bool isActivate;};*
>
>
> Y el array lo declaro así:
>
> *struct item items[100];*
>
> Todo esto lo pongo dentro de la clase que creo, es decir después de :
>
> #include <Ice/Ice.h>
> #include <IceUtil/IceUtil.h>
> #include <gtkmm.h>
> class Application : public Gtk::Window {
>
> Dentro de esta clase tengo unos hilos de ejecución. Y quiero modificar los
> valores de item de una posición del array por ejemplo:
>
>
>
> *items[0].name = "prueba";items[0].isActivate =1;*
>
> Al modificarlos desde dentro de un hilo no se guarda en los valores del
> array. Lo que hago es desde un hilo modificar los valores como acabo de
> escribir y desde otro lo imprimo, pero me sale el valor al que se ha
> inicializado el array.
>
> void* change ( void* ) {
>       std::cout << items[i].name << std::endl;
> }
>
> Espero haberme explicado bien.
>
> Muchas gracias,
> Laura M.
>
> _______________________________________________
> Jde-developers mailing list
> Jde-developers en gsyc.es
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20140731/e890b780/attachment-0001.htm 


More information about the Jde-developers mailing list