Problema de starvation com threads em c

08/12/2008

1

Galera,
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");
}



Responder

Posts

09/12/2008

Rodc

Você está testando no 98 ou no XP?
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.


Responder

09/12/2008

Roishibr

Estou usando linux.
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


Responder

10/12/2008

Roishibr

vou usar um yield mesmo em vez de mudar as prioridades ou escalonamentos das threads.

[]s


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira