Jump to content

Problema/Duvida usando threads


Primordius
 Share

Recommended Posts

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 by pmg
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.