[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