Toggle navigation
Fórum Root.cz
Domů
Nápověda
Vyhledávání
Přihlásit
Registrovat
Fórum Root.cz
Hlavní témata
Vývoj
Jak vyřešit Problém Santa Clause?
« předchozí
další »
+
Tisk
Stran: [
1
]
Jak vyřešit Problém Santa Clause?
3 Odpovědí
2005 Zhlédnutí
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ář
»
IP zaznamenána
Reklama
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.
IP zaznamenána
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?
IP zaznamenána
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.
IP zaznamenána
+
Tisk
Stran: [
1
]
« předchozí
další »
Fórum Root.cz
Hlavní témata
Vývoj
Jak vyřešit Problém Santa Clause?