Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Ajuda com semáforos


cpereira

Pergunta

Olá a todos,

é a primeira vez que estou a trabalhar com semáforos em C#, e também para ser sincero nunca semáforos nunca foi o meu forte.

A questão é a seguinte, tenho uma classe estática que vai guardando informação durante o decorrer da aplicação. A essa classe poderão aceder várias threads, e claro existem zonas criticas. Basicamente estou a fazer um sem.WaitOne() quando vou ler/escrever nas zonas criticas e depois faço o sem.Release(). O problema é que a uma determinada altura fica tudo bloqueado, parece uma situação de Deadlock, fica tudo à espera que haja um release.

Aqui fica a classe, se pudessem dar uma vista de olhos e comentar o que está mal agradecia, pois como já referi há pouco não tenho muita experiência com semáforos.

Desde já agradeço a vossa atenção.

class DadosActuais
    {
        static Semaphore sem = new Semaphore(1, 1);

        static ArrayList numeroSerieDesconhecidos = new ArrayList();
        static ArrayList numeroSerieConhecidos = new ArrayList();

        /// <summary>
        /// Adiciona um novo nº de série à lista de nº de série conhecidos
        /// </summary>
        /// <param name="numeroSerie">Nº de série a adicionar</param>
        public static void addNumeroSerieConhecido(string numeroSerie)
        {
            sem.WaitOne();

            numeroSerieConhecidos.Add(numeroSerie);
           
            sem.Release();
        }

        /// <summary>
        /// Adiciona um novo nº de série à lista de nº de série desconhecidos
        /// </summary>
        /// <param name="numeroSerie"></param>
        public static void addNumeroSerieDesconhecido(string numeroSerie)
        {
            sem.WaitOne();

            foreach (string nSerie in numeroSerieDesconhecidos)
            {
                if (nSerie.CompareTo(numeroSerie) == 0)
                    return;
            }
            numeroSerieDesconhecidos.Add(numeroSerie);

            sem.Release();
        }

        /// <summary>
        /// Limpa a lista de nº de série desconhecidos
        /// </summary>
        public static void limpaNumeroSerieDesconhecido()
        {
            sem.WaitOne();

            numeroSerieDesconhecidos.Clear();

            sem.Release();
        }

        /// <summary>
        /// Obtém o indice da posição em que se encontra guardado o nº de série do equipamento
        /// </summary>
        /// <param name="numeroSerie">Nº de série do equipamento</param>
        /// <returns>Devolve o indice em que se encontra guardade o equipamento</returns>
        private static int getIndiceEquipamento(string numeroSerie)
        {
            int i = 0;
            foreach (string nSerie in numeroSerieConhecidos)
            {
                if (nSerie.CompareTo(numeroSerie) == 0)
                    return i;
                i++;
            }
            return i;
        }

        /// <summary>
        /// Guarda os nº de série registados na base de dados
        /// </summary>
        /// <param name="lista">Lista com equipamentos registados na base de dados</param>
        public static void carregaDados(ArrayList listaEq)
        {
            foreach (Equipamento eq in listaEq)
            {
                addNumeroSerieConhecido(eq.numeroSerie);
            }
        }

        /// <summary>
        /// Verifica se o nº de série é de um equipamento conhecido
        /// </summary>
        /// <param name="numeroSerie">Nº de série</param>
        /// <returns>Devolve true caso o nº de série pertença a um equipamento conhecido ou false caso contrário</returns>
        public static bool verificaExisteConhecido(string numeroSerie)
        {
            sem.WaitOne();
            foreach (string nSerie in numeroSerieConhecidos)
            {
                if (nSerie.CompareTo(numeroSerie) == 0)
                {
                    sem.Release();
                    return true;
                }
            }
            sem.Release();
            return false;
        }

        /// <summary>
        /// Verifica se o nº de série é de um equipamento desconhecido
        /// </summary>
        /// <param name="numeroSerie">Nº de série</param>
        /// <returns>Devolve true caso o nº de série pertença a um equipamento desconhecido ou false caso contrário</returns>
        public static bool verificaExisteDesconhecido(string numeroSerie)
        {
            sem.WaitOne();
            foreach (string nSerie in numeroSerieDesconhecidos)
            {
                if (nSerie.CompareTo(numeroSerie) == 0)
                {
                    sem.Release();
                    return true;
                }
            }
            sem.Release();
            return false;
        }
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...