Problema com sincronização de threads!

3 respostas
L

Olá Galera,

Estou com um problema em um trabalho para a faculdade. A idéia é simular um roteador com 4 interfaces, cada uma delas com uma fila sendo alimentadas com “pacotes” pela sua respectiva thread. Há ainda uma outra thread que é o roteador em si, a qual retira os pacotes de todas as filas e os “encaminha” a porta correta.
Segue trechos do código.

//Thread1
for( int i = 0; i < 20; i++){
	boolean sucesso = fila1.offer(pacote);
	if (sucesso)
		out.println(pacote+" pacote enviado ao roteador");//log pacotes gerados
	else
		out.println(pacote+" Descartado Fila cheia!!");//log pacotes gerados
}

//Thread2
for( int i = 0; i < 20; i++){
boolean sucesso = fila2.offer(pacote);
if (sucesso)
	out.println(pacote+" pacote enviado ao roteador");//log pacotes gerados
else
	out.println(pacote+" Descartado Fila cheia!!");//log pacotes gerados
}

//Thread roteador
while (!fila1.isEmpty() & !fila2.isEmpty()){
	try{
		pacote1 = (String) fila10.take();
		pacote2 = (String) fila20.take();
		out.println("Pacote "+pacote1+" roteado");//log do roteador
		out.println("Pacote "+pacote2+" roteado");//log do roteador
	}......

Em todas as threads eu uso um “sleep(x)” para simular os intervalos de chegada e saída dos pacotes ao roteador. Como podem ver o tamanho das filas é 10, mas eu gero mais pacotes em cada thread para simular o descarte de pacotes por buffer cheio.

O problema é que pacotes são inseridos nas filas e a thread “roteador” encerra antes de tratar alguns pacotes, como se as filas estivessem vazias. Em resumo é um problema de sincronismo que não consigo resolver.

Logs Gerados:

Pacotes Gerados
20.0.0.253 40.0.0.157 TTL=2 pacote enviado ao roteador
20.0.0.243 10.0.0.57 TTL=9 pacote enviado ao roteador
20.0.0.88 30.0.0.71 TTL=9 Descartado Fila cheia!!
20.0.0.238 40.0.0.253 TTL=5 Descartado Fila cheia!!
20.0.0.11 10.0.0.241 TTL=3 pacote enviado ao roteador [color=red]//este pacote ficou na fila2 e não foi tratado[/color]
20.0.0.221 40.0.0.252 TTL=3 Descartado Fila cheia!!

Pacotes Roteados
Pacote 20.0.0.253 40.0.0.157 TTL=2 roteado
Pacote 20.0.0.243 10.0.0.57 TTL=9 roteado

Se puderem me ajudar, agradeço.

3 Respostas

ViniGodoy

Poste os códigos completos.

kinow

Realmente não dá para te ajudar com o código pela metade. Se o projeto não for grande anexe-o ao post.

L

Galera,
o problema continua, eventualmente alguns pacotes ainda continuam nas filas e não são retirados pela classe router, como pode ser visto nos arquivos de log.

Segue o código em anexo.

Aguardo sugestões.

Abraços.

Criado 28 de maio de 2008
Ultima resposta 29 de mai. de 2008
Respostas 3
Participantes 3