Cod sursa(job #2497147)

Utilizator lucianistratiIstrati Lucian lucianistrati Data 22 noiembrie 2019 09:50:52
Problema Aria Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define MAX_RESOURCES 5
int count;
int available_resources = MAX_RESOURCES;
pthread_mutex_t mtx;	
int resurse[]={1,2,3,2,2};
void displayResource(int a,int b)
{
	printf("GOT %d resources %d remaining\n",a,b);
}
void displayRelease(int a,int b)
{
	printf("Released %d resources %d remaining\n",a,b);
}
int decrease_count(int count)	
{
	pthread_mutex_lock(&mtx);
	if(available_resources < count)	
		{pthread_mutex_unlock(&mtx);		
		return -1;}
	else{
		available_resources-=count;
		displayRelease(count,available_resources);
		pthread_mutex_unlock(&mtx);
	}
	return 0;
}
int increase_count(int count)	
{
	pthread_mutex_lock(&mtx);
	available_resources += count;	
	displayResource(count,available_resources);	
	pthread_mutex_lock(&mtx);	
	return 0;
}
void * foo(void* v) 
{
	int recource=*(int *)v;
	increase_count(recource);
	//AHHHHH
	decrease_count(recource);
    return NULL;
}
void barrier_point()
{
	int N = 5,i,ans=-1;
	pthread_t * thread = malloc(sizeof(pthread_t)*N);		
	printf("NTHRS=%d\n",N);
	pid_t tid;	
 	int counter[]={0,1,2,3,4};
	for(i=1;i<=N;i++)
	{
		ans=pthread_create(&thread[i], NULL, (void *(*)(void *)) foo, &counter[i-1]);
		if( ans != 0) 
		{
           printf("pthread error!\n");
       	}
    
       	pthread_join(thread[i],NULL);
	}
}
/*
void * functie()
{
 	int *count = (int*) v;
 	
}*/
void * tfun(void * v)	
{
	int *tid = (int*) v;	
	printf("%d reached the barrier\n",*tid);
	barrier_point();
	printf("%d passed the barrier\n",*tid);
	free(tid);
	return NULL;	
}

int main()
{
	//Ex 1	
	printf("MAX_RESOURCES=%d\n",MAX_RESOURCES);	
	//printf("hey")

	int N = 5,i,ans=-1;
	pthread_t thread[5];		
	pid_t tid;	
	count = 0;
     int counter[]={0,1,2,3,4};
    if(pthread_mutex_init(&mtx,NULL)) {
		perror(NULL);
		return errno;
	}
	for(i=0;i<=N-1;i++)
	{
		ans=pthread_create(&thread[i], NULL, (void *(*)(void *)) foo, &counter[i-1]);
		if( ans != 0) 
		{
           printf("pthread error!\n");
       	}
	}
    for(i=0;i<=N-1;i++)
	{
       	pthread_join(thread[i],NULL);
	}
	//Ex 2
	//void * v;	
	//tfun(v);
}