Programando com Threads em C
|
|
|
- Baltazar Godoi de Escobar
- 9 Há anos
- Visualizações:
Transcrição
1 Programando com Threads em C
2 O que são Threads? Linhas de execução concorrentes Memória (pilha) independente Podem compartilhar áreas de memória Início Processo 1 Threads Fim
3 Problemas Sincronização entre elas Condições de corrida (race conditions) Deadlock s Localização de erros Difícil garantia de correção dos programas (modelos analíticos e verificação formal) Imprevisibilidade
4 Estruturas e Funções Usadas Biblioteca pthread.h pthread_t (struct) pthread_create pthread_join pthread_kill pthread_exit
5 Criação de Threads pthread_t threads[2]; void *thread_func(void *arg) {... int main(int argc, char **argv) { int i; for(i=0; i<2; i++) { pthread_create(&(threads[i]), NULL, thread_func, NULL); for(i=0; i<2; i++) { pthread_join(threads[i], NULL);
6 Passando Parâmetros pthread_t threads[2]; void *thread_func(void *arg) { int *n = (int *)arg;... int main(int argc, char **argv) { int i, a = 10; for(i=0; i<2; i++) pthread_create(&(threads[i]), NULL, thread_func, &a); for(i=0; i<2; i++) pthread_join(threads[i], NULL);
7 Um Programa Completo (1/2) #include <stdlib.h> #include <stdio.h> #include <pthread.h> typedef struct { int idx, length; thread_arg, *ptr_thread_arg; pthread_t threads[2]; void *thread_func(void *arg) { ptr_thread_arg targ = (ptr_thread_arg)arg; int i; for(i=targ->idx; i<(targ->idx + targ->length); i++) printf( Thread %d value %d\n, pthread_self(), i);
8 Um Programa Completo (2/2) int main(int argc, char **argv) { thread_arg arguments[2]; int i; for(i=0; i<2; i++) { arguments[i].idx = i * 10; arguments[i].length = 10; pthread_create(&(threads[i]), NULL, thread_func, &(arguments[i])); for(i=0; i<2; i++) { pthread_join(threads[i], NULL);
9 Compilando Biblioteca de pthreds é dinâmica Linha de comando gcc... -lpthread
10 Somando Números (1/4) #include <stdlib.h> #include <stdio.h> #include <pthread.h> #define NUMTHREADS 2 #define VETSIZE 5000 typedef struct { int fromidx, length; thread_arg, *ptr_thread_arg; pthread_t threads[numthreads]; thread_arg arguments[numthreads]; int nums[vetsize]; int sum; void *thread_func(void *arg);
11 Somando Números (2/4) int main(int argc, char **argv) { int i, length, remainder; sum = 0; length = VETSIZE / NUMTHREADS; remainder = VETSIZE % NUMTHREADS; for(i=0; i<numthreads; i++) { arguments[i].fromidx = i * length; arguments[i].length = length; if(i == (NUMTHREADS 1)) arguments[i].length += remainder; pthread_create(&(threads[i]), NULL, thread_func, &(arguments[i])); for(i=0; i<numthreads; i++) pthread_join(threads[i], NULL); printf( A soma dos numeros do vetor eh %d\n, sum);
12 Somando Números (3/4) void *thread_func(void *arg) { ptr_thread_arg argument = (ptr_thread_arg)arg; int i, localsum = 0, endidx; endidx = argument->fromidx + argument->length; for(i=argument->fromidx; i<endidx; i++) { localsum += nums[i]; sum += localsum;
13 Somando Números (4/4) Qual é o problema com o programa anterior?
14 Solução Sincronização!!!
15 Alguns Conceitos Exclusão mútua Uma thread está executando sozinha um determinado código, enquanto as outras esperam para poder executar Sessão crítica Parte do programa que deve ser executada por somente uma thread de cada vez (em exclusão mútua)
16 Primitivas de Sincronização Semáforos Monitores Troca de mensagens
17 Estruturas e Funções Usadas pthread_mutex_t (struct) sem. binário pthread_mutex_lock pthread_mutex_unlock sem_t (struct) sem. não binário sem_wait sem_post
18 Produtor / Consumidor (1/4) Consumidor Buffer Compartilhado Produtor
19 Produtor / Consumidor (2/4) #include <stdlib.h> #include <stdio.h> #include <pthread.h> #define NUMCONS 2 #define NUMPROD 2 #define BUFFERSIZE 1000 pthread_t cons[numcons]; Pthread_t prod[numprod]; int buffer[buffersize]; int currentidx; void *consumidor(void *arg); void *produtor(void *arg);
20 Produtor / Consumidor (3/4) int main(int argc, char **argv) { int i; srand48(time()); currentidx = 0; for(i=0; i<numcons; i++) pthread_create(&(cons[i]), NULL, consumidor, NULL); for(i=0; i<numprod; i++) pthread_create(&(prod[i]), NULL, produtor, NULL); for(i=0; i<numcons; i++) pthread_join(cons[i], NULL); for(i=0; i<numprod; i++) pthread_join(prod[i], NULL);
21 Produtor / Consumidor (4/4) void *produtor(void *arg) { int n; while(1) { n = (int)(drand48() * ); buffer[currentidx++] = n; printf( Produzindo numero %d\n, n); sleep((int)(drand48() * 4.0));
22 Produtor / Consumidor (4/4) void *produtor(void *arg) { int n; while(1) { n = (int)(drand48() * ); buffer[currentidx++] = n; printf( Produzindo numero %d\n, n); sleep((int)(drand48() * 4.0)); void *consumidor(void *arg) { int n; while(1) { n = buffer[--currentidx]; printf( Consumindo numero %d\n, n); sleep((int)(drand48() * 4.0));
23 E de novo... Qual é o problema com o programa anterior?
24 1a. Tentativa de Solução (1/4) #include <stdlib.h> #include <stdio.h> #include <pthread.h> #define NUMCONS 2 #define NUMPROD 2 #define BUFFERSIZE 1000 pthread_t cons[numcons]; pthread_t prod[numprod]; pthread_mutex_t buffer_mutex; int buffer[buffersize]; int currentidx; void *consumidor(void *arg); void *produtor(void *arg);
25 1a. Tentativa de Solução (2/4) int main(int argc, char **argv) { int i; srand48(time()); currentidx = 0; pthread_mutex_init(&buffer_mutex, NULL); for(i=0; i<numcons; i++) pthread_create(&(cons[i]), NULL, consumidor, NULL); for(i=0; i<numprod; i++) pthread_create(&(prod[i]), NULL, produtor, NULL); for(i=0; i<numcons; i++) pthread_join(cons[i], NULL); for(i=0; i<numprod; i++) pthread_join(prod[i], NULL);
26 1a. Tentativa de Solução (3/4) void *produtor(void *arg) { int n; while(1) { n = (int)(drand48() * ); pthread_mutex_lock(&buffer_mutex); buffer[currentidx++] = n; pthread_mutex_unlock(&buffer_mutex); printf( Produzindo numero %d\n, n); sleep((int)(drand48() * 4.0));
27 1a. Tentativa de Solução (4/4) void *consumidor(void *arg) { int n; while(1) { pthread_mutex_lock(&buffer_mutex); n = buffer[--currentidx]; pthread_mutex_unlock(&buffer_mutex); printf( Consumindo numero %d\n, n); sleep((int)(drand48() * 4.0));
28 Agora sim... Ficou correto?
29 Agora sim... Ficou correto? Não!!!! Por quê? Quem controla a ocupação do buffer?
30 Agora sim... Ficou correto? Não!!!! Por quê? Quem controla a ocupação do buffer?
31 2a. Tentativa de Solução (1/4) #include <stdlib.h> #include <stdio.h> #include <pthread.h> #include <sem.h> #define NUMCONS 2 #define NUMPROD 2 #define BUFFERSIZE 1000 pthread_t cons[numcons]; pthread_mutex_t buffer_mutex; int buffer[buffersize]; sem_t buffer_full, buffer_empty; void *consumidor(void *arg); void *produtor(void *arg); pthread_t prod[numprod]; int currentidx;
32 2a. Tentativa de Solução (2/4) int main(int argc, char **argv) { int i; srand48(time()); currentidx = 0; pthread_mutex_init(&buffer_mutex, NULL); sem_init(&buffer_full, 0, BUFFERSIZE); sem_init(&buffer_empty, 0, 0); for(i=0; i<numcons; i++) { pthread_create(&(cons[i]), NULL, consumidor, NULL); for(i=0; i<numprod; i++) {... pthread_create(&(prod[i]), NULL, produtor, NULL);
33 2a. Tentativa de Solução (3/4) void *produtor(void *arg) { int n; while(1) { n = (int)(drand48() * ); sem_wait(&buffer_full); pthread_mutex_lock(&buffer_mutex); buffer[currentidx++] = n; pthread_mutex_unlock(&buffer_mutex); sem_post(&buffer_empty); printf( Produzindo numero %d\n, n); sleep((int)(drand48() * 4.0));
34 2a. Tentativa de Solução (4/4) void *consumidor(void *arg) { int n; while(1) { sem_wait(&buffer_empty); pthread_mutex_lock(&buffer_mutex); n = buffer[--currentidx]; pthread_mutex_unlock(&buffer_mutex); sem_post(&buffer_full); printf( Consumindo numero %d\n, n); sleep((int)(drand48() * 4.0));
35 Barreira (1/3) Arquivo barrier.h typedef struct { pthread_mutex_t mutex; sem_t waitsem; int nthreads, current; barrier_t, *ptr_barrier_t; void barrier_init(ptr_barrier_t, int); void barrier(ptr_barrier_t);
36 Barreira (2/3) void barrier_init(ptr_barrier_t pbarrier, int nt) { Arquivo barrier.c pbarrier->nthreads = nt; pbarrier->current = 0; pthread_mutex_init(&(pbarrier->mutex), NULL); sem_init(&(pbarrier->waitsem), 0, 0);
37 Barreira (3/3) Arquivo barrier.c void barrier(ptr_barrier_t pbarrier) { int i; pthread_mutex_lock(&(pbarrier->mutex)); pbarrier->current++; if(pbarrier->current < pbarrier->nthreads) { else{ pthread_mutex_unlock(&(pbarrier->mutex)); sem_wait(&(pbarrier->waitsem)); for(i=0; i<(pbarrier->nthreads - 1); i++) sem_post(&(pbarrier->waitsem)); pbarrier->current = 0; pthread_mutex_unlock(&(pbarrier->mutex));
38 Tutorial de PThreads
Programando com Threads em C
Programando com Threads em C AEDS III Bruno Diniz de Paula ([email protected]) e-commerce System Performance Evaluation and Experimental Development Lab O que são Threads? Linhas de execução concorrentes
Programação de Sistemas
Programação de Sistemas Pai Natal Programação de Sistemas Pai Natal : 1/16 Problema (1) Considere o Pai Natal ( Santa Claus ) se encontra a dormir na sua loja em Rovaniemi-Lapónia finlandesa, sendo acordado
Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads
Universidade Federal do ABC Disciplina: BC 1518 Sistemas Operacionais (SO) Prática: Threads Atividade 3 Threads em Ambiente LINUX Objetivo Estudo e testes com a biblioteca pthreads Threads Como vimos em
Pthreads. O que são threads? Mario João Junior. Uma thread é um fluxo de execução de instruções que pode ser escalonado pelo sistema operacional.
Pthreads Mario João Junior O que são threads? Uma thread é um fluxo de execução de instruções que pode ser escalonado pelo sistema operacional. O que são threads? No UNIX, uma thread: Existe no interior
OO Engenharia Eletrônica
OO Engenharia Eletrônica - Programação em C/C++ Slides 18: Introdução à Multithreading. Introdução à Multithreading: execução concorrente de tarefas. Exemplos usando a biblioteca pthread que é de acordo
Linguagem de Programação I
Linguagem de Programação I Carlos Eduardo Batista Centro de Informática - UFPB [email protected] Exemplo: Explorar Templates e Exceções Incrementar com o uso de STL 2 Crie uma função verificarpalindromo()
Trabalhando com Processos e Threads em Ambiente LINUX
Objetivo Universidade Federal do ABC Disciplina: BC 1518 Sistemas Operacionais (SO) Prática: Processo/Threads Atividade 3 Trabalhando com Processos e Threads em Ambiente LINUX 1.Trabalhar com comandos
Programação de Sistemas
Programação de Sistemas Jantar dos filósofos Programação de Sistemas Jantar dos filósofos : 1/14 Introdução (1) O jantar dos filósofos, proposto por Dijkstra em 1971, é o problema mais famoso de acesso
Exclusão Mútua (mutex)
2004-2017 Volnys Bernal 1 Exclusão Mútua (mutex) Volnys Borges Bernal [email protected] Departamento de Sistemas Eletrônicos Escola Politécnica da USP 2004-2017 Volnys Bernal 2 Tópicos Exclusão Mútua (Mutex)
Sistemas Operacionais
Sistemas Operacionais Programação Concorrente Sincronização entre processos Edson Moreno edsonmoreno@pucrsbr http://wwwinfpucrsbr/~emoreno Sumário Conceituação Princípios de concorrência Região crítica
Programação com Posix Threads
9 Programação com Posix Threads Revisão: Data: 11-03-2016 Cap. 9 1/6 Programação multi-threaded com Pthreads 9.1. O que é uma thread? Um processo represente a execução pelo sistema operativo dum programa.
Sincronização e comunicação entre entidades de processamento. Mutex Volnys Bernal 1. Tópicos. Exclusão Mútua (mutex) Exclusão Mútua (Mutex)
2004-2013 Volnys Bernal 1 2004-2013 Volnys Bernal 2 Tópicos Exclusão Mútua (mutex) Volnys Borges Bernal [email protected] http://www.lsi.usp.br/~volnys Exclusão Mútua () Objetivo, utilidade, requisitos
Introdução aos Sistemas Operacionais. Threads
Introdução aos Sistemas Operacionais Threads Eleri Cardozo FEEC/Unicamp O que é uma Thread? Uma thread (linha de controle) é uma unidade de execução e de controle, alocação e compartilhamento de recursos
AULA 3 Alocação dinâmica de memória: Ponteiros
UNIP - Ciência da Computação e Sistemas de Informação Estrutura de Dados AULA 3 Alocação dinâmica de memória: Ponteiros Estrutura de Dados 1 Variáveis X Ponteiros VARIÁVEL - Estrutura para armazenamento
FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara
Universidade do Estado de Minas Gerais - UEMG Curso de Engenharia da Computação FUNÇÕES EM C 1 Material adaptado da profa Silvana Maria Affonso de Lara ROTEIRO DA AULA Definição de Função Argumentos, retornos
MC504 Sistemas Operacionais MC514 Sistemas Operacionais: Teoria e
Instituto de Computação Universidade Estadual de Campinas Nome: MC504 Sistemas Operacionais MC514 Sistemas Operacionais: Teoria e Prática Profa. Islene Calciolari Garcia 18 de setembro de 2013 Questão
tutorial. man fork man pthread_create man pthread_join man wait man sleep
Abaixo, você encontrá dicas para lhe ajudar a fazer o 1º trabalho de SOI, que está descrito na página do curso. Lembrando que essas dicas visam apenas o auxilio nas partes mais problemáticas do trabalho
Programação concorrente usando threads POSIX e Java
Programação concorrente usando threads POSIX e Java MAC 431 / MAC 5742 Introdução à Computação Paralela e Distribuída Daniel Cordeiro DCC - IME - USP 13 de agosto de 2012 Introdução Por que escrever programas
Linguagem de Programação C
ICMC USP Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade Lopes MODULARIZAÇÃO Um problema complexo é melhor abordado se for dividido primeiramente em vários subproblemas MODULARIZAÇÃO
Aula 3/4: Vetores/Matrizes e Ponteiros
Carlos Henrique/Introdução C++ Aula 3/4: Vetores/Matrizes e Ponteiros Funções: Função main (int argc, char ** argv) Recursão Vetores/Matrizes/Strings Vetor (Matriz Unidimensional) Gerando um ponteiro para
Pthreads API. Criação de Threads: usando Pthreads
Pthreads API The POSIX 1003.1-2001 standard defines an application programming interface (API) for writing multithreaded applications. This interface is known more commonly as pthreads. 6.1 Criação de
SISTEMAS OPERACIONAIS. 2ª. Lista de Exercícios
SISTEMAS OPERACIONAIS INF09344 - Sistemas Operacionais / INF02780 - Sistemas Operacionais / INF02828 - Sistemas de Programação II Prof a. Roberta Lima Gomes ([email protected]) 2ª. Lista de Exercícios Data
Tipos Abstratos de Dados (TAD)
Instituto de C Tipos Abstratos de Dados (TAD) Luis Martí Instituto de Computação Universidade Federal Fluminense [email protected] - http://lmarti.com Tópicos Principais Módulos e Compilação em separado
Programação Estruturada I
Programação Estruturada I Introdução a Linguagem C Prof. Thiago Caproni Tavares 1 Prof. Mateus dos Santos 2 1 [email protected] 2 [email protected] Última Atualização:
UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO
Curso: Engenharia de Computação e Ciência da Computação Data: 10/09/2013 Disciplina: Programação Estruturada Valor: 3,0 pontos Professor: Henrique Monteiro Cristovão Nota: Aluno: Prova resolvida 4ª Prova
Memória compartilhada
Memória compartilhada Luiz Affonso Guedes 1 Ivanovitch Silva 1 [email protected] [email protected] 1 Universidade Federal do Rio Grande do Norte 15 de outubro de 2009 Memória compartilhada DCA0109 - Prática
Referências. Programação de Computadores II. Cap. 7 Cadeias de Caracteres. Caracteres. Tópicos
Referências Programação de Computadores II Cap. 7 Cadeias de Caracteres Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 7 Livro: Waldemar
Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Material preparado pela profa Silvana Maria Affonso de Lara
Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação FUNÇÕES EM C 1 Material preparado pela profa Silvana Maria Affonso de Lara 2º semestre de 2010 ROTEIRO DA AULA Definição
#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {
422 #include void Swap (int *a,int *b) int temp; temp=*a; *a=*b; *b=temp; main () int num1,num2; printf("\nentre com o primeiro valor: "); scanf ("%d",&num1); printf("\nentre com o segundo valor:
SISTEMAS OPERACIONAIS. 2ª. Lista de Exercícios
SISTEMAS OPERACIONAIS Prof a. Roberta Lima Gomes ([email protected]) 2ª. Lista de Exercícios Data de Entrega: não há. O objetivo da lista é ajudar no estudo individual dos alunos. SINAIS 1. Qual a diferença
A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).
Fila Algumas aplicações impõem regras de acesso às informações armazenados em estruturas de dados, restringindo como os dados são inseridos e removidos da estrutura. A fila, também conhecida como QUEUE,
9. Tipos Abstratos de Dados
9. Tipos Abstratos de Dados R. Cerqueira, W. Celes e J.L. Rangel Neste capítulo, discutiremos uma importante técnica de programação baseada na definição de Tipos Abstratos de Dados (TAD). Veremos também
Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória
Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP Alocação Dinâmica de Memória Alocação Estática x Dinâmica C: dois tipos de alocação de memória: Estática e Dinâmica Na alocação estática, o espaço
Listas (Parte 2) Túlio Toffolo [email protected] www.toffolo.com.br. BCC202 Aula 10 Algoritmos e Estruturas de Dados I
Listas (Parte 2) Túlio Toffolo [email protected] www.toffolo.com.br BCC202 Aula 10 Algoritmos e Estruturas de Dados I Listas Encadeadas Características: Tamanho da lista não é pré-definido Cada elemento
Do alto-nível ao assembly
Do alto-nível ao assembly Compiladores Cristina C. Vieira 1 Viagem Como são implementadas as estruturas computacionais em assembly? Revisão dos conceitos relacionados com a programação em assembly para
Sistemas Operacionais
Sistemas Operacionais Programação Concorrente Problemas clássicos Edson Moreno [email protected] http://www.inf.pucrs.br/~emoreno Sumário Produtor / consumidor O jantar dos filósofos O barbeiro sonolento
SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos
Funções SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves ICMC/USP São Carlos Slides baseados no material gentilmente cedido pela Profa Simone Senger Souza 2 MODULARIZAÇÃO Um
Listas ligadas/listas encadeadas
1 Listas ligadas/listas encadeadas Leitura recomendada: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html 2 Processamento elementar de listas Definição mais restritiva (tipo de lista possivelmente
Subprogramas. (ou Sub-rotinas) em C: Procedimentos e Funções. 2015/1 Programação Básica de Computadores (INF 09325)
Subprogramas (ou Sub-rotinas) em C: Procedimentos e Funções 2015/1 Programação Básica de Computadores (INF 09325) Archimedes Detoni www.inf.ufes.br/~archimedesdetoni [email protected] Programa
Curso C: Funções e Macros
Universidade de Brasília Departamento de Ciência da Computação Curso C: Funções e Macros Prof. Ricardo Pezzuol Jacobi [email protected] Funções Fun es s o blocos de c digo que podem ser nomeados e chamados
Programação Sistemas
Programação Sistemas Fios de Execução Programação de Sistemas Threads : 1/28 Porquê o paralelismo? (1) 1. Crescentes necessidades de computação têm sido satisfeitas com aumento do número de transístores
Alocação Dinâmica de Memória
Alocação Dinâmica de Memória Luiz Chaimowicz, Raquel O. Prates, Pedro O.S. Vaz de Melo Algoritmos e Estruturas de Dados II DCC UFMG Alocação Estática x Dinâmica C: dois tipos de alocação de memória: Estática
