<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">El 29/07/14 a las #4, Laura Mart�n
Ram�rez escribi�:<br>
</div>
<blockquote cite="mid:DUB120-W52F689B143AC147DC94158C0F80@phx.gbl"
type="cite">
<div dir="ltr">
<div dir="ltr">
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style>
<div dir="ltr">
<div><font style="" color="#2672EC"><i>struct item{<br>
��� std::string name;<br>
��� bool isActivate;<br>
};</i></font><br>
<br>
Y el array lo declaro as�:<br>
<br>
<font style="" color="#2672EC"><i>struct item items[100];</i></font><br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
<br>
Bien, una estructura est�tica.<br>
<br>
<br>
<blockquote cite="mid:DUB120-W52F689B143AC147DC94158C0F80@phx.gbl"
type="cite">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div>Todo esto lo pongo dentro de la clase que creo, es
decir despu�s de :<br>
<br>
<font style="" color="#2672EC">#include <Ice/Ice.h></font><font
style="" color="#2672EC"><br>
</font><font style="" color="#2672EC">#include
<IceUtil/IceUtil.h></font><font style=""
color="#2672EC"><br>
</font><font style="" color="#2672EC">#include
<gtkmm.h></font><font style="" color="#2672EC"><br>
</font><font style="" color="#2672EC">class Application :
public Gtk::Window {</font><br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
<br>
Entonces es una propiedad (variable) privada de la clase.<br>
<br>
<br>
<blockquote cite="mid:DUB120-W52F689B143AC147DC94158C0F80@phx.gbl"
type="cite">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div>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:<br>
<font style="" color="#2672EC"><br>
</font><i><font style="" color="#2672EC">items[0].name =
"prueba";</font><font style="" color="#2672EC"><br>
</font><font style="" color="#2672EC">items[0].isActivate
=1;</font></i><br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
<br>
Seg�n parece quieres solucionar problemas de concurrencia.<br>
<br>
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).<br>
<br>
Tendr�as que declararlo como:<br>
<br>
<br>
<font style="" color="#2672EC"><i>volatile struct item items[100];</i></font><br>
<br>
<br>
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.<br>
<br>
<a href="http://www.cplusplus.com/reference/array/array/">http://www.cplusplus.com/reference/array/array/</a><br>
<a href="http://www.cplusplus.com/reference/list/list/">http://www.cplusplus.com/reference/list/list/</a><br>
<br>
<br>
<br>
<blockquote cite="mid:DUB120-W52F689B143AC147DC94158C0F80@phx.gbl"
type="cite">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div>Al modificarlos desde dentro de un hilo no se guarda en
los valores del array.<br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
<br>
Esto es lo que no entiendo... �qu� quieres decir con que no se
guardan los valores del array?<br>
<br>
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:<br>
<br>
while (true) {<br>
����� std::cout << items[0].name << std::endl;<br>
����� IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(1)); /*
asumo que usas ICE */<br>
}<br>
<br>
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.<br>
<br>
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".<br>
<br>
<br>
<blockquote cite="mid:DUB120-W52F689B143AC147DC94158C0F80@phx.gbl"
type="cite">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div>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.<br>
<br>
<font style="" color="#2672EC">void* change ( void* ) {</font><font
style="" color="#2672EC"><br>
</font><font style="" color="#2672EC">��� � std::cout
<< items[i].name << std::endl; </font><font
style="" color="#2672EC"><br>
</font><font style="" color="#2672EC">}</font><br>
<br>
Espero haberme explicado bien.<br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
<br>
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?<br>
<br>
Quiz� quer�as decir "void change(void) {" o simplemente "void
change() {".<br>
<br>
Resumiendo:<br>
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.<br>
b) Debes usar mecanismos para controlar la concurrencia (acceso de
lectura y/o modificaci�n) a los datos de ese array est�tico.<br>
<br>
Para ese �ltimo punto te aconsejo usar las herramientas que te
ofrece ICE para esa tarea:<br>
<a href="http://doc.zeroc.com/pages/viewpage.action?pageId=5048344">http://doc.zeroc.com/pages/viewpage.action?pageId=5048344</a><br>
<br>
<br>
Tu c�digo quedar�a:<br>
<br>
<font style="" color="#2672EC"><i>IceUtil::Mutex _datosMutex;<br>
volatile struct item items[100];<br>
[...]<br>
while (true) {</i></font><br>
<font style="" color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i>����� </i></font>_datosMutex.lock();</i></font></i></font><br>
<font style="" color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i>����� /* Podemos leer
datos de la estructura de manera segura */<br>
</i></font></i></font></i></font></i></font>�����
std::cout << items[0].name << std::endl;<br>
</i></font><font style="" color="#2672EC"><i><font style=""
color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i>����� </i></font>_datosMutex.unlock();</i></font></i></font></i></font><br>
<font style="" color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i><font style=""
color="#2672EC"><i><font style=""
color="#2672EC"><i>����� </i></font></i></font></i></font></i></font>
</i></font></i></font>/* la espera debe realizarse FUERA
de la zona de exclusi�n mutua */<br>
����� IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(1));
/* asumo que usas ICE */<br>
}<br>
[...]<br>
</i></font><font style="" color="#2672EC"><i><font style=""
color="#2672EC"><i><font style="" color="#2672EC"><i>_datosMutex.lock();</i></font></i></font><br>
/<font style="" color="#2672EC"><i><font style=""
color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i><font style=""
color="#2672EC"><i>* Podemos modificar los
datos de la estructura de manera segura */<br>
</i></font></i></font></i></font></i></font></i></font>items[0].name
= "prueba";<br>
items[0].isActivate =1;<br>
</i></font><font style="" color="#2672EC"><i><font style=""
color="#2672EC"><i><font style="" color="#2672EC"><i><font
style="" color="#2672EC"><i>_datosMutex.unlock();</i></font></i></font></i></font><br>
</i></font><font style="" color="#2672EC"><i><font style=""
color="#2672EC"><i>[...]<br>
</i></font></i></font><br>
<br>
<blockquote cite="mid:DUB120-W52F689B143AC147DC94158C0F80@phx.gbl"
type="cite">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div>Muchas gracias,<br>
Laura M.<br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Espero que te sea de utilidad.<br>
</body>
</html>