P1)
- funciona!
- no funciona porque las variables no son compartidas.
- no funciona por problemas de data race.
P2)
i)
Es suficiente con que se ejecute cont++ en difundir.
Luego se ejecuta esperar, el puntero retornado  aun no tiene el mismo valor que infoP.

ii)
Se pueden intercambiar las lneas
cont++; 
info= infoP; 
en difundir.

De todas formas es una solucin incorrecta en un procesador moderno. 
Lo que pasa es que los procesadores modernos pueden reordenar las escrituras cuando no hay sincronizacin de por medio.  Consideren esta secuencia:
T1                                            T2
infoP->data1 = ...;   W(infoP->data1)
infoP->data2 = ...;
difundir(infoP);
  info = infoP;
  cont++;             W(cont)
                                              Info *p= esperar();
                                              ... p->data1 ... p->data2 ...
                      W(infoP->data2)


El diagrama muestra con W( ... ) cuando se realizan realmente las escrituras.
El procesador en donde se ejecuta T2 podra ver que cont se actualiza antes que infoP->data2.  Por lo tanto obtiene el valor correcto de p->data1 pero no el de p->data2!

Hoy en da, la nica forma de garantizar que se hayan hecho las escrituras es a travs de alguna herramienta de sincronizacin.  Es decir tanto T1 como T2 tienen que haber pedido un semforo o monitor.

Por eso es muy riesgoso intentar evitar sincronizacin por medio de escrituras en memoria compartida.
3)
La funcin esperar es ineficiente ya que hace busy waiting. Soluciones de este tipo tienen nota 1 en los controles.

4)
para que no ocurra  un datarace mientras cambio info usare 2 semaforos (uno para escribir/leer sem) el otro para liberar a los que estan esperando


tendre mi semaforo de cola de espera: e
semaforo para prevenir dataraces: l

l parte con 1 ticket

nSem l= nMakeSem(1);
nSem e= nMakeSem(0);

difundir:

nwaitSem(l)
info=infoP;

while(cont--){
nSignalSem(e)
}

nSignalSem(l)



esperar:
Info *myinfo;
nwaitSem(l);
cont++;
nSignalSem(l);

nwaitSem(e); //podria quedar esperando para la proxima, pero cumple con enunciado

nwaitSem(l);
myinfo=info; //para prevenir dataraces
nSignalSem(l);

return myinfo;

 P3
1)
mostrar un datarace  en el momento que se asigna el valor de crearNodoHoja a ppnodo (2 threads)
2)
crearNodHoja garantiza que los semaforos de los nodos nulos del arbol ya estan creados. 
basta con envolver la siguente linea:

if (*ppnodo==NULL) {
*ppnodo= crearNodoHoja(llave,
def); /* dado */
}

para esto se hace lo siguiente:


nwaitSem(sem)
if (*ppnodo==NULL) {
*ppnodo= crearNodoHoja(llave,
def); /* dado */
nSignalSem(sem)
}
else{
nSignalSem(sem)
.
.
.

