Foro de elhacker.net

Foros Generales => Dudas Generales => Mensaje iniciado por: vertigo123 en 7 Diciembre 2013, 17:08 pm



Título: Alguien entiende de threads en c++ metodos de sincronizacion
Publicado por: vertigo123 en 7 Diciembre 2013, 17:08 pm
Hola de nuevo y disculpas por el spam....jejejeje....Les queria pedir por favor que me dieran una idea o un ejemplo sencillo de como usar metodos sincronizados en c++ sean en visual o devc++....tengo un c´digo en java del ejercicico que quiero hacer nada mas que en c++  y creo que me pase en pedir una traduccion pero mi duda va hacia esa parte....aqui les dejo el codigo en java que funciona y adjunto mi codigo en c++ hasta el momento....Solo para que me guien como irme y como hacer los pasos y metodos adecuados para que mi programa funcione ya que si lo pongo por partes no van a aentender ustedes

Mi gran duda es en como usar los metodos synchronized de java a c++.

En conclusión lo que le spido por favor es que me ayuden en los metodos sincronizados ya que es alli donde tengo el problema se los agradeceré mucho!.

CODIGO JAVA:

http://foro.elhacker.net/dudas_generales/me_podrian_ayudar_a_pasar_codigo_java_a_c_por_favor-t404057.0.html


MI CODIGO C++:

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <stdio.h>
#include <pthread.h>
#ifdef _MSC_VER
#pragma comment(lib, "ptrheadVC2.lib")
#endif



using namespace std;

void Wait();
enum TEstadoPista{Aterrizar, Despegar, Vacia};
enum TEstadoAvion{QuiereAterrizar, QuiereDespegar, OtraCosa};

class Pista
{
      public:
             Pista(int id)
             {
                    id = id;
                    estado = TEstadoPista(Vacia);
                    naviones = 0;
             }
             void setEstado(TEstadoPista estado);
             TEstadoPista getEstado(){return estado;}
             void setNaviones(int naviones);
             int getNaviones(){return naviones;}
      private:
              int id;
              TEstadoPista estado;
              int naviones;
};

void Pista::setEstado(TEstadoPista estado)
{
     estado = estado;
}
void Pista::setNaviones(int naviones)
{
     naviones = naviones;
}


class TorreControl
{     public:
          const int MAXAVIONES=10;
          Pista *pistas[2];
          int pistasAviones[MAXAVIONES];
          TEstadoAvion estAviones[MAXAVIONES];
          int esperandoAterrizar;
         
          TorreControl()
          {
          esperandoAterrizar = 0;
             pistas[0] =  new Pista(1);
          pistas[1] =  new Pista(2);
          }
        int *PedirPistaAterrizar(int idAvion)
        {
           pistasAviones[idAvion]=0;
           estAviones[idAvion] = TEstadoAvion::QuiereAterrizar;
           for(int i=0; i<2; i++)
           { 
              if((pistas->getEstado()==TEstadoPista::Vacia) && (estAviones[idAvion]==TEstadoAvion::QuiereAterrizar))
            {
              pistas->setEstado(TEstadoPista::Aterrizar);
              pistas->setNaviones(pistas->getNaviones() + 1);
              estAviones[idAvion] = TEstadoAvion::OtraCosa;
              pistasAviones[idAvion] = i+1;
            }
           }
           if(estAviones[idAvion]==TEstadoAvion::QuiereAterrizar)
           {
              esperandoAterrizar = esperandoAterrizar + 1;
           }
           return pistasAviones[idAvion];
        }

        int TorreControl::PuedeAterrizar(int idAvion)
        {
           while(estAviones[idAvion] == TEstadoAvion::QuiereAterrizar)
           {
              try
              {
                 wait();
              }
              catch(exception ex)
              {
                 cout<<"Interrupción"<<endl;
              }
           }
           return pistasAviones[idAvion];

        }

        int TorreControl::PedirPistaDespegar(int idAvion)
        {
           pistasAviones[idAvion] = 0;
           estAviones[idAvion] = TEstadoAvion::QuiereDespegar;
           if(esperandoAterrizar==0)
           {
              for(int i=0; i<2; i++)
              {
                 //Revisar Aquí.
                 if((pistas->getEstado()==TEstadoPista::Vacia) || (pistas->getEstado()==TEstadoPista::Despegar && pistas->getNaviones() < 3))
                 {
                    pistas->setEstado(TEstadoPista::Despegar);
                    pistas->setNaviones(pistas->getNaviones() + 1);
                    estAviones[idAvion] = TEstadoAvion::OtraCosa;
                    pistasAviones[idAvion] = i + 1;
                 }

              }

           }
           return pistasAviones[idAvion];
        }

        int TorreControl::PuedeDespegar(int idAvion)
        {
           while(estAviones[idAvion]==TEstadoAvion::QuiereDespegar)
           {
              try
              {
                 wait();
                
              }
              catch(exception ex)
              {
                 cout<<"Despegando"<<endl;
              }
           }
        }

        void TorreControl::GestionarEsperas()
        {
           for(int i=0; i<MAXAVIONES; i++)
           {
              if(estAviones==TEstadoAvion::QuiereAterrizar)
              {
                 for(int j=0; j<2; j++)
                 {
                    if((pistas[j]->getEstado()==TEstadoPista::Vacia) && (estAviones==TEstadoAvion::QuiereAterrizar))
                    {
                       pistas[j]->setEstado(TEstadoPista::Despegar);
                       pistas[j]->setNaviones(pistas->getNaviones()+1);
                       estAviones = TEstadoAvion::OtraCosa;
                       pistasAviones=j+1;
                       esperandoAterrizar = esperandoAterrizar - 1;
                       notifyAll();
                      
                    }

                 }

              }
              else if(estAviones==TEstadoAvion::QuiereDespegar && esperandoAterrizar==0)
              {
                 for(int k=0; k<2; k++)
                 {
                    if((pistas[k]->getEstado()== TEstadoPista::Vacia) || (pistas[k]->getEstado()==TEstadoPista::Despegar && pistas[k]->getNaviones()<3) && (estAviones==TEstadoAvion::QuiereDespegar))
                    {
                       pistas->setEstado(TEstadoPista::Despegar);
                       pistas->setNaviones(pistas->getNaviones()+1);
                       estAviones = TEstadoAvion::OtraCosa;
                       pistasAviones = i+1;
                       notifyAll();
                      
                    }

                 }

              }


           }

        }
};

class Avion:
{
};


int main(int argc, char *argv[])
{
   const int MAXAVIONES = 10;

  system("PAUSE");
  return 0;
}

void Wait()
{
    for(int i=0; i<10000; i++)
     {
        for(int j=0; j<100000; j++)
        {       
        }
     }
}