I have problem that if I create for example 100 threads program work correctly but if I define more threads for example 1000
// if I change static int NUM_E from 100 to 1000
than program stop about 350 threads and doesn't continue
where should be problem please?
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
// deklaracia poctu elfov a sobov
int c_elves;
int c_reindeer;
int e_end;
int r_end;
int koniec_cyklu;
// deklaracia semaforov nad vlaknami
sem_t s_elves;
sem_t s_reindeer;
sem_t s_waitingR;
sem_t s_cakaren;
//mutex santa
pthread_mutex_t m_santa;
pthread_mutex_t m_elves;
pthread_mutex_t m_reindeer;
//podmienky
pthread_cond_t con_elves;
pthread_cond_t con_reindeer;
// deklaracia vlakien
void *f_reindeer(void *);
void *f_elves(void *);
void *f_santa(void *);
// deklaracia fukcii
void prepareSleigh();
void getHitched(int ktory);
void helpElves(void);
void getHelp(int ktory);
// definujeme si pocet sobov
static int NUM_R = 9;
static int NUM_E = 1000;
// hlavny program
int main(int argc, char **argv)
{
//deklaracia lokalnych premmenych
int i,j,index;
//inicializacia pociatocnych semaforov a ich hodnot
sem_init(&s_elves,0,1);
sem_init(&s_reindeer,0,0);
sem_init(&s_cakaren,0,0);
sem_init(&s_waitingR,0,1);
//inicializacia mutexov
pthread_mutex_init(&m_santa,NULL);
pthread_mutex_init(&m_elves,NULL);
pthread_mutex_init(&m_reindeer,NULL);
pthread_mutex_lock(&m_santa);
//definicia pola sobov,skriatkov a santu
pthread_t t_reindeer[NUM_R];
pthread_t t_elves[NUM_E];
pthread_t t_santa;
//definicia poctu elfov a sobov ktory chcu pomoct resp sa vratili z "dovolenky"
c_reindeer = 0;
c_elves = 0;
e_end = 0;
r_end = 0;
koniec_cyklu = 0;
index = 0;
pthread_create(&t_santa, NULL, f_santa, (void *)NULL);
for (i = 0; i < NUM_E; i++)
{
pthread_create(&t_elves, NULL, f_elves, (void *)i);
}
for (i = 0; i < NUM_R; i++)
{
pthread_create(&t_reindeer, NULL, f_reindeer, (void *)i);
}
pthread_join(t_santa,NULL);
for (i = 0; i < NUM_R; i++)
{
pthread_join(t_reindeer, NULL);
}
for (i = 0; i < NUM_E; i++)
{
pthread_join(t_elves, NULL);
}
return 0;
}
//
//vlakno sob
void *f_reindeer(void *param)
{
printf("\033[01;37msom sob cislo %d\n",(int)param+1);
sem_wait(&s_waitingR);
c_reindeer++;
if (c_reindeer == 9)
{
pthread_mutex_unlock(&m_santa);
}
sem_post(&s_waitingR);
sem_wait(&s_reindeer);
getHitched((int)param);
c_reindeer--;
if(c_reindeer == 0)
{
koniec_cyklu = 1;
while(r_end == 0)
{
pthread_cond_broadcast(&con_reindeer);
}
}
return;
}
//
//vlakno elf
void *f_elves(void *param)
{
printf("\033[01;37msom skriatok cislo %d\n",(int)param+1);
//ak uz santa odletel a prisiel skriatok koniec
if (koniec_cyklu == 1)
{
printf("\33[22;31melf konci prisiel neskoro %d\n",param+1);
return;
}
//cakanie semafor
sem_wait(&s_elves);
//ak uz caka v semafore a dokoncili sa sobovia iba ukoncenie
if (koniec_cyklu == 1)
{
printf("\33[22;31melf konci prisiel neskoro %d\n",param+1);
sem_post(&s_elves);
return;
}
//kod elfa ked pride do cakarne
c_elves++;
if (c_elves == 3)
{
pthread_mutex_unlock(&m_santa);
}
else
{
sem_post(&s_elves);
}
//cakanie pred "dverami kde je santa" teda caka sa kym budu 3 skriatkovia
sem_wait(&s_cakaren);
getHelp((int)param);
c_elves--;
if(c_elves == 0)
{
while (e_end == 0)
{
pthread_cond_broadcast(&con_elves);
}
sem_post(&s_elves);
}
printf("\33[22;31melf konci normalne %d\n",param+1);
return;
}
//
//vlakno santa
void *f_santa(void *param)
{
int i;
while(1)
{
pthread_mutex_lock(&m_santa);
e_end = 0;
r_end = 0;
if (c_reindeer == 9)
{
prepareSleigh();
for(i = 0; i < 9; i++)
{
sem_post(&s_reindeer);
}
pthread_mutex_lock(&m_reindeer);
pthread_cond_wait(&con_reindeer,&m_reindeer);
r_end = 1;
pthread_mutex_unlock(&m_reindeer);
e_end = 1;
sem_post(&s_elves);
sem_post(&s_cakaren);
sem_post(&s_cakaren);
sem_post(&s_cakaren);
printf("\33[22;33msanta konci\n");
return;
}
else
{
if (c_elves == 3)
{
helpElves();
for(i = 0; i < 3; i++)
{
sem_post(&s_cakaren);
}
//cez mutex
pthread_mutex_lock(&m_elves);
pthread_cond_wait(&con_elves,&m_elves);
e_end = 1;
pthread_mutex_unlock(&m_elves);
}
}
}
return;
}
//funkcia priprav sane -- santa
void prepareSleigh(void)
{
printf("\033[22;33mpripravujem sane\n");
return;
}
//funkcia priputaj -- sob
void getHitched(int ktory)
{
printf("\033[22;32msom zviazany %d\n",ktory+1);
return;
}
//funkcia pomoz elfom -- santa
void helpElves(void)
{
printf("\033[22;33mdavam pomoc\n");
return;
}
//funkcia dostal som pomoc -- elf
void getHelp(int ktory)
{
printf("\033[22;31mdostal som pomoc%d\n",ktory+1);
return;
}