Jak vyřešit Problém Santa Clause?

SantaClaus

Jak vyřešit Problém Santa Clause?
« kdy: 11. 12. 2010, 21:57:46 »
Zdravim, riesim problem Santa clausa santa claus. Robim to v Cecku a zbehne to dobre, len ak mi tam ostanu skriatkovia potom co odidu sobovia, tak mam problem s ich zrusenim. Niekde tam to padne... Ak sa niekto v tom probleme vyzna, alebo to uz riesil, budem vdacny za radu... tu je kod:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#include <sched.h>
#define NUM_THREADS 100

int ii;
int pocet_sobov=0;
int pocet_skriatkov=0;
int santa_dostal_signal_od_soba=0;
int santa_dostal_signal_od_skriatkov=0;
int sob_dostal_signal=0;
int skriatok_dostal_signal=0;

pthread_mutex_t sob_mutex;
pthread_mutex_t sob_mutex_cakaj;
pthread_mutex_t sob_skriatok_mutex;
pthread_mutex_t skriatok_mutex_cakaj;
pthread_mutex_t skriatok_mutex;
pthread_mutex_t santa_mutex;

pthread_attr_t attr;

pthread_cond_t sob_cond;
pthread_cond_t sob_cond_cakaj;
pthread_cond_t skriatok_cond;
pthread_cond_t santa_cond;


pthread_t tid[NUM_THREADS];

void GetHitched()
{
    printf("Sob: Zapriahol som sa\n");
}

void GetHelp()
{
    printf("Skriatok: Santa mi pomaha\n");
}

void PrepareSleigh()
{
    printf("Santa: Pripravujem sane\n");
}

void HelpElves()
{
    printf("Santa: Pomaham skriatkom\n");
}

void santa()
{
while((pocet_sobov<=9))
{
    pthread_mutex_lock(&santa_mutex);         printf("Santa: Spim\n");
    pthread_cond_wait(&santa_cond,&santa_mutex);      printf("Santa: Zobudil som sa\n");
    pthread_mutex_unlock(&santa_mutex);

    if(pocet_sobov==9)
    {
   santa_dostal_signal_od_soba=1;
   PrepareSleigh();
   while(sob_dostal_signal<9)
   {
       pthread_cond_broadcast(&sob_cond_cakaj);      //printf("Santa: Signal sobom\n");printf("%d sobov dostalo signal\n",sob_dostal_signal);
   }
   pocet_sobov++;      //pocet sobov >9 uvodny while uz nejde z polovice
   printf("###################### SOBOVIA odbaveni #################\n");
   if(pocet_skriatkov!=0)HelpElves();
                                     //printf("%d < %d\n",skriatok_dostal_signal,pocet_skriatkov);
   printf("Pocet zvysnych skriatkov: %d\n",pocet_skriatkov);
   santa_dostal_signal_od_skriatkov=1;
   /*while(skriatok_dostal_signal<pocet_skriatkov)
   {
       pthread_cond_broadcast(&skriatok_cond);   
   }
   skriatok_dostal_signal=0;
   pocet_skriatkov=334;*/
   for(ii=10;ii<=20;ii++)
   {
       pthread_cancel(tid[ii]);
      
       printf("!!!!!!!!!!!!!!!!!!Skriatok %d zruseny\n",ii);
   }
    }
    else
    {
   if(pocet_skriatkov==3)
        {
      santa_dostal_signal_od_skriatkov=1;
      HelpElves();
          while(skriatok_dostal_signal<3)
        {
       pthread_cond_broadcast(&skriatok_cond);      //printf("Santa: Signal skriatkom\n");printf("%d skriatkov dostalo signal\n",skriatok_dostal_signal);
    }
   
    skriatok_dostal_signal=0;
    pocet_skriatkov=0;
                        //printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SKRIATKOVIA odbaveni @@@@@@@@@@@@@@@@@\n");
    pthread_mutex_unlock(&skriatok_mutex);
    }
    }

}
}

void pridaj_soba()
{
    pthread_mutex_lock(&sob_mutex);
int pc;
    pocet_sobov=pocet_sobov+1;
    pc=pocet_sobov;
    printf("Sob(%d): Prisiel som\n",pc);
    if(pocet_sobov==9)
    {
   printf("_______________________________________________Sob(%d): Som posledny, volam santu\n",pc);
   while(santa_dostal_signal_od_soba==0)
        {
      pthread_cond_signal(&santa_cond);         //printf("Sob: POSIELAM SIGNAL SANTOVI\n");
        }
    }
    pthread_mutex_unlock(&sob_mutex);
    pthread_mutex_lock(&sob_mutex_cakaj);         //printf("Sob(%d): Cakam\n",pc);
    pthread_cond_wait(&sob_cond_cakaj,&sob_mutex_cakaj);
    GetHitched();
    sob_dostal_signal++;
    pthread_mutex_unlock(&sob_mutex_cakaj);
}


void pridaj_skriatka()
{
    pthread_mutex_lock(&skriatok_mutex);
    pocet_skriatkov=pocet_skriatkov+1;         //printf("Skriatok: Prisiel som\n");
    if(pocet_skriatkov==3)
    {                     printf("Skriatok: Sme 3 skriatkovia,volam santu\n");
   while(santa_dostal_signal_od_skriatkov==0)
   {
       pthread_cond_signal(&santa_cond);   //printf("//////////////////////////");
        }
   santa_dostal_signal_od_skriatkov=0;
    }
    else
    {
   pthread_mutex_unlock(&skriatok_mutex);
    }
    //if(pocet_skriatkov<3)
    {
   pthread_mutex_lock(&skriatok_mutex_cakaj);         //printf("Skriatok: Cakam\n");
        pthread_cond_wait(&skriatok_cond,&skriatok_mutex_cakaj);
   GetHelp();
        skriatok_dostal_signal++;
        pthread_mutex_unlock(&skriatok_mutex_cakaj);
    }
}


void main()
{
int i;
    pthread_attr_init(&attr);
    pthread_attr_setschedpolicy(&attr,SCHED_OTHER);

    pthread_mutex_init(&sob_mutex,NULL);
    pthread_mutex_init(&sob_mutex_cakaj,NULL);
    pthread_mutex_init(&skriatok_mutex,NULL);
    pthread_mutex_init(&skriatok_mutex_cakaj,NULL);
    pthread_mutex_init(&santa_mutex,NULL);
    pthread_mutex_init(&sob_skriatok_mutex,NULL);

    pthread_cond_init(&sob_cond,&sob_mutex);
    pthread_cond_init(&sob_cond_cakaj,&sob_mutex_cakaj);
    pthread_cond_init(&skriatok_cond,&skriatok_mutex_cakaj);

    pthread_create(&tid[0],&attr,&santa,NULL);

    for(i=10;i<=20;i++)
    {
   pthread_create(&tid,&attr,&pridaj_skriatka,NULL);   
    }

    for(i=1;i<=9;i++)
    {
   printf("___________Vytvoril som soba\n");
   pthread_create(&tid,&attr,&pridaj_soba,NULL);   
    }
   
   
    for(i=1;i<=3;i++)
    {
   pthread_join(tid,NULL);
    }

    pthread_mutex_destroy(&sob_mutex);
    pthread_mutex_destroy(&sob_mutex_cakaj);
    pthread_mutex_destroy(&skriatok_mutex);
    pthread_mutex_destroy(&skriatok_mutex_cakaj);
    pthread_mutex_destroy(&santa_mutex);
    pthread_mutex_destroy(&sob_skriatok_mutex);

    pthread_attr_destroy(&attr);
    printf("************************************* MEGAKONIEC ********************************");
}
« Poslední změna: 13. 12. 2010, 00:45:53 od Petr Krčmář »


kagro

Re: Jak vyřešit Problém Santa Clause?
« Odpověď #1 kdy: 13. 12. 2010, 11:26:41 »
Zdravim Vas,

no myslim, ze tam mate chybku uz pri vytvarani vlakien.

Ak chcete, zastavte sa na FRA 202.

                                         

SantaClaus

Re: Jak vyřešit Problém Santa Clause?
« Odpověď #2 kdy: 14. 12. 2010, 10:46:57 »
Zdravim,
vdaka za reakciu, stavim sa vo stvrtok doobedu. Moze byt?

kagro

Re: Jak vyřešit Problém Santa Clause?
« Odpověď #3 kdy: 14. 12. 2010, 19:33:54 »
OK, ale az po 10:00 dovtedy ucim.