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++) { } } } |