O algoritmo de ricart-agrawala é um algoritmo para exclusão mutua num sistema distribuído. Esta é uma implementação em C usando o padrão MPI.

Código-fonte

#include
#include
#include "mpi.h"

#define N 4

enum tags { request= 0, reply};

int my_rank;
int size;
MPI_Request send_reqs[N];
MPI_Request recv_reqs[N];
MPI_Status send_stats[N];
MPI_Status recv_stats[N];

int deferred[N];

void critical_section(){
	char *poema[] = {"Minha terra tem palmeiras,",
			"Onde canta o Sabia;",
			"As aves, que aqui gorjeiam,",
			"Nao gorjeiam como la."};

	printf("[%d] %s\n", my_rank, poema[my_rank]);
}

void master_job(){
	if(sizeN)
		printf("Too many processes. ");
	if((sizeN)){
		printf("This program should be initialized with %d processes.\n", N);
		printf("Example:\n");
		printf("mpirun -np %d ricart_agrawala\n", N);
		MPI_Finalize();
		exit(-1);
	}
	#ifdef DEBUG
	printf("Initializing %d processes...\n", size);
	#endif
}

int main(int argc, char **argv){
	int i, output, input[N], who, input_buffer, replies, ticket;
	MPI_Status tmp;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
	MPI_Comm_size (MPI_COMM_WORLD, &size);

	if(my_rank == 0)
		master_job();

	for(i=0;i

Código-fonte para download, ricart_agrawala_simple.tar.bz2.

Para executar este exemplo é necessário ter uma implementação do MPI funcionando (MPICH ou LAM por exemplo).

Para instalar a MPICH no Ubuntu 7.04 eu usei:

sudo apt-get install openmpi-bin openmpi-common openmpi-dev openmpi-libs0 libmpich1.0c2 libmpich-mpd1.0c2 mpich-bin mpich-mpd-bin mpi-doc

Para compilar esse programa:

mpicc ricart_agrawala.c -o ricart_agrawala

E para rodar use o mpirun:

mpirun -np 4 ./ricart_agrawala

Isso vai rodar 4 processos do binário.

obs: Nesse pacote há dois scripts, compile.sh e run.sh, para facilitar o trabalho de compilação e execução.

Para saber mais:

Palavras-chave: MPI, c, programação distribuída, problema da seção crítica, exclusão mútua, MPI_Isend, MPI_Irecv, MPI_Wait, MPI_Waitall, MPI_Send.