Escolar Documentos
Profissional Documentos
Cultura Documentos
As respostas devem ser enviadas em um relatório no modelo de artigo da SBC ou no modelo da ABNT.
Parte 1. Threads
1. Compile MyThread.c com “gcc -lpthread MyThread.c” e execute-o com strace. Em seguida, altere N para
descobrir o número máximo de threads que podem ser criados no seu computador. Qual chamada de sistema é
responsável pela criação dos threads? Explique suas descobertas.
4. Os threads criados pelo MyThread.c sempre imprimem sua saída na mesma ordem? (Dica, tente executar
várias vezes). Explique sua resposta.
5. Altere o primeiro loop for em MyThread.c, para que ele decremente em vez de incrementar. Isso é garantido
para alterar a saída do programa? Explique sua resposta.
6. Compile MyThread.java usando “javac MyThread.java” e execute como “time java MyThread”. Quanto tempo
demora para executar a versão Java e a versão C? Explique o resultado.
7. Suponha que um único aplicativo esteja sendo executado em um sistema multicore com 16 processadores. Se
20% do código for inerentemente serial, qual é o ganho de desempenho em relação a um único sistema de
processador?
O código de base consiste em 100 threads, onde cada thread tenta fazer 100.000 incrementos em uma variável global
compartilhada sum. Se tudo correr bem, o valor final da variável sum deve ser 100×100.000 = 10.000.000.
Neste código, as threads acessam a variável compartilhada sem nenhum controle de concorrência.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 100
#define NUM_STEPS 100000
int sum = 0 ;
pthread_exit (NULL) ;
}
pthread_attr_init (&attr) ;
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE) ;
// create threads
for(i=0; i<NUM_THREADS; i++) {
status = pthread_create (&thread[i], &attr, threadBody, (void *) i) ;
if (status) {
perror ("pthread_create") ;
exit (1) ;
}
}
pthread_attr_destroy (&attr) ;
pthread_exit (NULL) ;
}
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 100
#define NUM_STEPS 100000
int sum = 0 ;
int busy = 0 ;
pthread_exit (NULL) ;
}
pthread_attr_init (&attr) ;
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE) ;
// create threads
for(i=0; i<NUM_THREADS; i++) {
status = pthread_create (&thread[i], &attr, threadBody, (void *) i) ;
if (status) {
perror ("pthread_create") ;
exit (1) ;
}
}
2.3 - Alternância
Esta solução consiste em definir uma variável turn que indica quem pode acessar a seção crítica a cada instante. Ao
sair da seção crítica, cada thread incrementa o valor dessa variável, fazendo com que a próxima thread tenha acesso à
seção crítica.
Explique o exemplo abaixo.
Esta solução funciona, mas é muito lenta. Por que?
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 100
#define NUM_STEPS 100000
int sum = 0 ;
int turn = 0 ;
pthread_exit (NULL) ;
}
pthread_attr_init (&attr) ;
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE) ;
// create threads
for(i=0; i<NUM_THREADS; i++) {
status = pthread_create (&thread[i], &attr, threadBody, (void *) i) ;
if (status) {
perror ("pthread_create") ;
exit (1) ;
}
}
pthread_attr_destroy (&attr) ;
pthread_exit (NULL) ;
}
Esta solução consiste em usar operações atômicas, como Test-and-Set Lock e similares. No exemplo abaixo é usada
uma operação OR atômica.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 100
#define NUM_STEPS 100000
int sum = 0 ;
int lock = 0 ;
pthread_exit (NULL) ;
}
pthread_attr_init (&attr) ;
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE) ;
// create threads
for(i=0; i<NUM_THREADS; i++) {
status = pthread_create (&thread[i], &attr, threadBody, (void *) i) ;
if (status) {
perror ("pthread_create") ;
exit (1) ;
}
}
Escreva um relatório descrevendo, detalhadamente, o que foi feito nas duas etapas anteriores. O intuito aqui é
demonstrar, textualmente, a compreensão dos conceitos e capacidade de aplicá-los.