<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 &lt;Ice/Ice.h&gt;</font><font
                style="" color="#2672EC"><br>
              </font><font style="" color="#2672EC">#include
                &lt;IceUtil/IceUtil.h&gt;</font><font style=""
                color="#2672EC"><br>
              </font><font style="" color="#2672EC">#include
                &lt;gtkmm.h&gt;</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 &lt;&lt; items[0].name &lt;&lt; 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
                &lt;&lt; items[i].name &lt;&lt; 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 &lt;&lt; items[0].name &lt;&lt; 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>