C: Starvation

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
#include <stdio.h>
#include <pthread.h>
 
#define BOOL int
#define TRUE 1
#define FALSE 0
 
int x;
pthread_mutex_t mutex_de_x, mutex_de_y;
 
void *minha_thread1(void *null)
{	
	BOOL consegui_lock_em_x=FALSE, consegui_lock_em_y=FALSE;
 
	while(!consegui_lock_em_x || !consegui_lock_em_y)
	{
		consegui_lock_em_x=FALSE;
		consegui_lock_em_y=FALSE;
 
		if (!pthread_mutex_trylock(&mutex_de_x))
		{
			consegui_lock_em_x=TRUE;
			printf("minha_thread1: Obtive acesso ao mutex X.\n");
			printf("minha_thread1: Aguardando 1 segundo...\n");
			sleep(1);
			printf("minha_thread1: Tentando mutex Y...\n");		
			if (!pthread_mutex_trylock(&mutex_de_y))
			{
				consegui_lock_em_y=TRUE;
				printf("minha_thread1: Obtive acesso ao mutex Y.\n");
				printf("minha_thread1: Liberando mutex Y...\n");
				pthread_mutex_unlock(&mutex_de_y);
			}
			else
			{
				printf("minha_thread1: Não obtive acesso ao mutex Y.\n");
				consegui_lock_em_y=FALSE;
			}
			printf("minha_thread1: Aguardando 1 segundo...\n");
			sleep(1);
			printf("minha_thread1: Liberando mutex X...\n");
			pthread_mutex_unlock(&mutex_de_x);
		}
		else
			consegui_lock_em_x=FALSE;
 
		printf("minha_thread1: consegui_lock_em_x=%d,consegui_lock_em_y=%d\n",consegui_lock_em_x,consegui_lock_em_y);
		sleep(1);		
	}
 
	pthread_exit(NULL);
}
 
void *minha_thread2(void *null)
{	
	BOOL consegui_lock_em_x=FALSE, consegui_lock_em_y=FALSE;
 
	while(!consegui_lock_em_x || !consegui_lock_em_y)
	{
		consegui_lock_em_x=FALSE;
		consegui_lock_em_y=FALSE;
 
		if (!pthread_mutex_trylock(&mutex_de_y))
		{
			consegui_lock_em_y=TRUE;
			printf("\tminha_thread2: Obtive acesso ao mutex Y.\n");
			printf("\tminha_thread2: Aguardando 1 segundo...\n");
			sleep(1);
			printf("\tminha_thread2: Tentando mutex X...\n");		
			if (!pthread_mutex_trylock(&mutex_de_x))
			{
				consegui_lock_em_y=TRUE;
				printf("\tminha_thread2: Obtive acesso ao mutex X.\n");				
				printf("\tminha_thread2: Liberando mutex X...\n");
				pthread_mutex_unlock(&mutex_de_x);
			}
			{
				printf("\tminha_thread2: Não obtive acesso ao mutex X.\n");
				consegui_lock_em_x=FALSE;
			}
			printf("\tminha_thread2: Aguardando 1 segundo...\n");
			sleep(1);
			printf("\tminha_thread2: Liberando mutex Y...\n");
			pthread_mutex_unlock(&mutex_de_y);
		}
		else
			consegui_lock_em_y=FALSE;
 
		printf("\tminha_thread2: consegui_lock_em_x=%d,consegui_lock_em_y=%d\n",consegui_lock_em_x,consegui_lock_em_y);
		sleep(1);
	}
 
	pthread_exit(NULL);
}
 
int main()
{
	int retorno_da_thread;
	pthread_t thread1, thread2;
	pthread_attr_t atributo_de_thread;
 
	pthread_attr_init(&atributo_de_thread);
	pthread_attr_setdetachstate(
		&atributo_de_thread, PTHREAD_CREATE_JOINABLE);
 
	pthread_mutex_init(&mutex_de_x,NULL);
	pthread_mutex_init(&mutex_de_y,NULL);
 
	if (pthread_create(&thread1,
		&atributo_de_thread,
		minha_thread1,NULL))
		printf("Erro ao criar a minha_thread1.\n");
 
	if (pthread_create(&thread2,
		&atributo_de_thread,minha_thread2,NULL))
		printf("Erro ao criar a minha_thread2.\n");
 
	if (pthread_join(thread1,(void **)&retorno_da_thread))
		printf("Erro no join de minha_thread1.\n");
	else
		printf("minha_thread1 joined.\n");
 
	if (pthread_join(thread2,(void **)&retorno_da_thread))
		printf("Erro no join de minha_thread2.\n");
	else
		printf("minha_thread2 joined.\n");
 
	pthread_mutex_destroy(&mutex_de_y);
	pthread_mutex_destroy(&mutex_de_x);
 
	pthread_attr_destroy(&atributo_de_thread);
 
	pthread_exit(NULL);
}