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

Oscar Garcia oscar.robotica en linaresdigital.com
Jue Jul 31 13:13:52 CEST 2014


Buenos d�as de nuevo, quiz� lleguen luego repetidos mis mensajes, pero 
por ahora vuelvo a enviarlo.

Saludos.


-------- Mensaje reenviado --------

El 30/07/14 a las #4, Laura Mart�n escribi�:
> Muchas gracias Ildefonso, me ha quedado bastante claro igual cuando me 
> ponga a hacerlo me surgen problemillas, pero ya lo he entendido y s� 
> por d�nde encaminarme :)


�Qu� ha pasado con mi mensaje?

Lo envi� d�ndole a responder a la lista (igual que estoy haciendo ahora) 
y lo tengo en la bandeja de elementos enviados, pero no lleg� a la lista 
(o eso parece). Pruebo a mand�rtelo de nuevo aqu�:


El 29/07/14 a las #4, Laura Mart�n Ram�rez escribi�:
> /struct item{
>     std::string name;
>     bool isActivate;
> };/
>
> Y el array lo declaro as�:
>
> /struct item items[100];/


Bien, una estructura est�tica.


> 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 {


Entonces es una propiedad (variable) privada de la clase.


> 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;/


Seg�n parece quieres solucionar problemas de concurrencia.

El primer problema que veo es que no has declarado el array como 
vol�til, por lo que el compilador podr�a realizar optimizaciones sobre 
el uso de la variable que podr�an provocar casos indeseados 
(optimizaciones en bucles sobre todo).

Tendr�as que declararlo como:


/volatile struct item items[100];/


Por otro lado, ya que est�s usando C++, deber�as plantearte usar clases 
en vez de estructuras, as� podr�s hacer uso de herramientas de 
tratamiento de listas, colas, etc m�s avanzadas que en C sin tener que 
controlar la memoria que se reserva, etc.

http://www.cplusplus.com/reference/array/array/
http://www.cplusplus.com/reference/list/list/



> Al modificarlos desde dentro de un hilo no se guarda en los valores 
> del array.


Esto es lo que no entiendo... �qu� quieres decir con que no se guardan 
los valores del array?

Si tienes en un bucle que se muestre el contenido de una variable o 
posici�n, sin el uso del modificador "volatile" no funcionar� debido a 
las optimizaciones del compilador:

while (true) {
       std::cout << items[0].name << std::endl;
       IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(1)); /* 
asumo que usas ICE */
}

Ese bucle anterior probablemente acabar� siendo una �nica obtenci�n del 
valor previo al bucle (la resoluci�n del valor se realiza accediendo a 
la posici�n deseada del array y moviendo el contenido de name a alguna 
posici�n temporal de la pila) y posteriormente, como no hay ninguna 
modificaci�n del array en el interior del bucle, posiblemente no se 
actualice ese valor temporal de la pila nunca m�s.

Aunque pensemos que deber�a accederse a esa informaci�n y refrescarse en 
cada iteraci�n del bucle puede que no sea as� si no usamos, como dije 
antes, el modificador "volatile".


> 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.


Ese c�digo no lo entiendo bien. �Para qu� tiene void* como salida si no 
haces un return? �Para qu� tienes un par�metro void* si no lo usas?

Quiz� quer�as decir "void change(void) {" o simplemente "void change() {".

Resumiendo:
a) Debes hacer uso del modificador "volatile" para evitar que el 
compilador realice optimizaciones en propiedades de clase que son 
cambiadas por otras hebras, incluso aunque estemos usando sem�foros para 
controlar la concurrencia hemos de evitar dichas optimizaciones.
b) Debes usar mecanismos para controlar la concurrencia (acceso de 
lectura y/o modificaci�n) a los datos de ese array est�tico.

Para ese �ltimo punto te aconsejo usar las herramientas que te ofrece 
ICE para esa tarea:
http://doc.zeroc.com/pages/viewpage.action?pageId=5048344


Tu c�digo quedar�a:

/IceUtil::Mutex _datosMutex;
volatile struct item items[100];
[...]
while (true) {/
////_datosMutex.lock();//
//////* Podemos leer datos de la estructura de manera segura */
//// std::cout << items[0].name << std::endl;
//////_datosMutex.unlock();///
/////////// ///* la espera debe realizarse FUERA de la zona de exclusi�n 
mutua */
IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(1)); /* asumo que 
usas ICE */
}
[...]
////_datosMutex.lock();//
//////* Podemos modificar los datos de la estructura de manera segura */
/////items[0].name = "prueba";
items[0].isActivate =1;
/////_datosMutex.unlock();///
///[...]
//

> Muchas gracias,
> Laura M.

Espero que te sea de utilidad.



------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20140731/f178ec6e/attachment-0001.htm 
------------ pr�xima parte ------------
Se ha borrado un mensaje que no est� en formato texto plano...
Nombre     : smime.p7s
Tipo       : application/pkcs7-signature
Tama�o     : 2245 bytes
Descripci�n: Firma criptográfica S/MIME
Url        : http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20140731/f178ec6e/attachment-0001.bin 


More information about the Jde-developers mailing list