Como sincronizar um processo com número aleatório de tópicos ativos?

votos
0

Eu tenho o seguinte problema. Meu processo gera 4 tópicos, que executam a mesma tarefa de forma independente e necessidade de esperar por todos eles para terminar o processamento antes de ir para a próxima iteração de processamento. No entanto, o número de linhas activas, isto é, o número de segmentos de processamento de dados e que precisa de esperar para os outros para terminar é variável de 1 a 4. Por exemplo, algumas vezes 2 fios irá processar os dados e que precisam de esperar uns aos outros antes de continuar.

Eu li que barreiras poderia fazer isso por mim, no entanto, quando eles são criados Tenho de especificar o número de threads que esperar, o que não é o caso com o meu pedido. Além disso, devido à forma como o aplicativo foi implementado, seria estranho e complexo para manter a criação / destruição de barreiras cada vez.

Eu queria saber se existe outra maneira de resolver este problema.

Obrigado!

Publicado 18/12/2018 em 11:02
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Isto é como você pode alcançá-lo usando Semaphore.

// Global Sempahore initialized to zero.
Sempahore global_sempahore(0)

// Your main thread which spawns your 'n' worker thraeds.
// After spawning 'n' threads your main thread will wait for those threads to finish.
for (int i=0; i<n; i++) {
    global_sempahore.sem_wait();
}


// This is your worker thread routine.
// After processing the common work routine before exiting each thread will signal the sempahore.
global_sempahore.sem_post();

A ideia é inicializar o sempahore no modo bloqueado com 0. Após desova seus n threads de trabalho em espera thread principal em sempahore para n vezes.

No segmento de trabalho pouco antes de sair sinalizar o semáforo.

Isso irá garantir que thread principal vai acordar somente quando todos os n tópicos terminado a execução.

Respondeu 20/12/2018 em 06:12
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more