Primordius Posted October 12, 2012 at 11:29 AM Report #478845 Posted October 12, 2012 at 11:29 AM (edited) Boa dia, eu tenho que fazer um exercício em que tenho que criar isto: Implemente uma aplicação que incrementa concorrentemente uma variável Counter de 0 até 20 utilizando tarefas Generalize o exercício anterior de forma que a variável seja incrementada por N tarefas (N é definido por uma constante). A cada tarefa é atribuída um identificador id (entre 0 e N-1). Cada tarefa só incrementa Counter quando id=Counter%N. Ao invés de E ou O, deve ser impresso a identificação da tarefa que incrementa a variável. Sugestão: utilize apenas uma função thr_incrementer que receba como argumento o identificador da função. /* * thread.c - counter thread */ #include <stdio.h> #include <pthread.h> int Counter = 0,N=100,id=0; pthread_mutex_t Mutex; void* thr_incrementer(void* ptr) { int* id = (int*)ptr; pthread_mutex_lock(&Mutex); while(*id == Counter%N) { Counter++; printf(" Id = %d; Counter = %d\n",*id,Counter); } pthread_mutex_unlock(&Mutex); return NULL; } int main() { pthread_t tid; while(id != N-1) { if (pthread_create(&tid, NULL, thr_incrementer, (void*)&id) != 0) { printf("Error creating thread.\n"); return -1; } if(pthread_join(tid,NULL) != 0) { printf("Error joining thread.\n"); return -1; } id++; } return 0; } o que eu tenho é isto... agora a minha duvida é a seguinte, eu desta forma estou a criar threads concorrentes? ou estou a criar uma de cada vez? se estiver a criar uma de cada vez (que é o que penso que estou a fazer) de que forma é que posso fazer para criar varias ao mesmo tempo e termina-las por ordem conforme a sua ID? Muito Obrigado Edited October 12, 2012 at 11:45 AM by pmg
HappyHippyHippo Posted October 12, 2012 at 01:31 PM Report #478855 Posted October 12, 2012 at 01:31 PM eu desta forma estou a criar threads concorrentes? ou estou a criar uma de cada vez? mesmo estando a criar threads, estas a criar um de cada vez. olha para o teu ciclo while da função main, mas dde uma forma corrida // primeira iteracao do ciclo if (pthread_create(&tid, NULL, thr_incrementer, (void*)&id) != 0) { printf("Error creating thread.\n"); return -1; } // thread criado if(pthread_join(tid,NULL) != 0) { printf("Error joining thread.\n"); return -1; } // thread terminado id++; // segunda iteração do ciclo if (pthread_create(&tid, NULL, thr_incrementer, (void*)&id) != 0) { printf("Error creating thread.\n"); return -1; } // thread criado if(pthread_join(tid,NULL) != 0) { printf("Error joining thread.\n"); return -1; } // thread terminado id++; como ves, nunca terás threads concorrentes. se estiver a criar uma de cada vez (que é o que penso que estou a fazer) de que forma é que posso fazer para criar varias ao mesmo tempo terás um ciclo de criação e um segundo ciclo para fazer os joins. nota : terás de guardar ostid's em algum lado para depois fazser os joins termina-las por ordem conforme a sua ID? não podes forçar isso pelo paradigma da concorrência, nunca saberás qual deles termina primeiro. o que podes fazer é chamar o join pelo ordem de criação (logo pelo ID dado) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now