Problema de starvation com threads em c
08/12/2008
0
No exemplo abaixo eu crio 5 threads que fazem apenas um print na tela. O problema é que a thread1 fica sempre executando não dando chance para as outras executarem. Alguém sabe como resolver? tentei setar prioridade, policy, etc mas não funcionou. Sei que se eu colocar, por exemplo, um sleep(1000) dentro de cada while() funciona, mas não posso fazer isso.
#include <cstdlib> include <iostream> include <pthread.h> include <stdio.h> void* thread1(void*); void* thread2(void*); void* thread3(void*); void* thread4(void*); void* thread5(void*); void createThreads(); int main(int argc, char *argv[]) { createThreads(); return EXIT_SUCCESS; } /*! Create threads and run. */ void createThreads() { pthread_attr_t attr; pthread_t thId; pthread_attr_init( &attr ); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED ); pthread_barrier_t barrier; // inicializacao da barreira de threads pthread_barrier_init(&barrier, NULL, 5); pthread_create(&thId, &attr, thread1, NULL); pthread_create(&thId, &attr, thread2, NULL); pthread_create(&thId, &attr, thread3, NULL); pthread_create(&thId, &attr, thread4, NULL); pthread_create(&thId, &attr, thread5, NULL); pthread_barrier_wait(&barrier); } void* thread1(void* arg) { while(true) printf("thread 1\n"); } void* thread2(void*) { while(true) printf("thread 2\n"); } void* thread3(void*) { while(true) printf("thread 3\n"); } void* thread4(void*) { while(true) printf("thread 4\n"); } void* thread5(void*) { while(true) printf("thread 5\n"); }
Roishibr
Posts
09/12/2008
Rodc
No 98 o processamento é cooperativo e não preemptivo, ou seja, a thread 1 precisa liberar o processador para as outras rodarem.
Já no XP é preemptivo, ou seja, o sistema operacional decide quando uma thread pára e quando a outra começa. Agora, como o Windows decide quem pára e quem começa eu não sei. Possivelmente a thread 1 não está deixando nem a thread principal criar as outras threads.
Sugiro colocar um Sleep(1) no while, ou outra coisa como ProcessMessages.
09/12/2008
Roishibr
Mas eu não sei pq as configurações de escalonamento (por processo ou sistema) não funcionam quando eu tento usar. Teóricamente deveriam funcionar.
[]s
10/12/2008
Roishibr
[]s
Clique aqui para fazer login e interagir na Comunidade :)