Serviços multithread

O SCM (Service Control Manager) controla um serviço enviando eventos de controle de serviço para a rotina do manipulador de controle do serviço. O serviço deve responder a eventos de controle em tempo hábil para que o SCM possa acompanhar o estado do serviço. Além disso, o estado do serviço deve corresponder à descrição de seu estado que o SCM recebe.

Devido a esse mecanismo de comunicação entre um serviço e o SCM, você deve ter cuidado ao usar vários threads em um serviço. Quando um serviço é instruído a parar pelo SCM, ele deve aguardar a saída de todos os threads antes de relatar ao SCM que o serviço foi interrompido. Caso contrário, o SCM pode ficar confuso sobre o estado do serviço e pode falhar ao desligar corretamente.

O SCM precisa ser notificado de que o serviço está respondendo ao evento de controle de parada e que estão sendo feitos progressos na interrupção do serviço. O SCM assumirá que o serviço está progredindo se o serviço responder (por meio de SetServiceStatus) dentro do tempo (dica de espera) especificado na chamada anterior para SetServiceStatus e o ponto de marcar for atualizado para ser maior do que o ponto de verificação especificado na chamada anterior para SetServiceStatus.

Se o serviço relatar ao SCM que o serviço parou antes de todos os threads terem sido encerrados, é possível que o SCM interprete isso como uma contradição. Isso pode resultar em um estado em que o serviço não pode ser interrompido ou reiniciado.