Jump to content
Sign in to follow this  
chrislix

miltiplicação de matrizes com thread

Recommended Posts

Alguem poderia me ajudar?

estou tentando multiplicar duas matrizes, A e B

e salvar o resultado em C

o resultado nao ta certo, to usando thread

so queria uma opinião para saber se ta certo o que to fazendo, pq o que ta me intrigando eh que os valores da linha da matriz C nao altera

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>


pthread_t thread_1;
pthread_t thread_2;
pthread_t thread_3;

int a[3][2] = {{1, 4}, {2, 5}, {3, 6}};
int b[2][3] = {{7, 8, 9}, {10, 11, 12}};
int c[3][3] = {{1, 2, 3}, {0, 0, 0}, {0, 0, 0}};

void* tarefa_1(void *p)
{
      printf("\nThread1\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[1][col] += a[1][i] * b[i][col];
            }
            printf("%i\t",c[1][col]);
            printf("\n");
      }
}

void* tarefa_2(void *p)
{
      printf("\nThread2\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[2][col] += a[2][i] * b[i][col];
            }
            printf("%i\t",c[2][col]);
            printf("\n");
      }
     
}
void* tarefa_3(void *p)
{
      printf("\nThread3\n");
      for (int col = 0; col < 3; col++) {
            // Multiplica a linha de A pela coluna de B.
            for (int i = 0; i < 2; i++) {
                c[3][col] += a[3][i] * b[i][col];
            }
            printf("%i\t",c[3][col]);
            printf("\n");
      }
     
}

int main()
{
   printf("Inicio das Threads...\n");
   
    // inicia as duas threads, passando como parametroa thread e a função que cada uma deve executar
   
    pthread_create(&thread_1, NULL, tarefa_1, NULL);
    pthread_create(&thread_2, NULL, tarefa_2, NULL);
    pthread_create(&thread_3, NULL, tarefa_3, NULL);
   
    // faz com que a thread principal espere a thread 1,2,3 acabarem;
   
    pthread_join(thread_1, NULL);
    pthread_join(thread_2, NULL);
    pthread_join(thread_3, NULL);
    printf("resultado da tabela 3\n");

    
        for(int i = 0;i<3; i++){
                for(int j= 0; j<3;j++){
              printf("%i\t  ",c[i][j]);
                }
                printf("\n");
        }

    exit(0);
}

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Similar Content

    • By pachecok
      Estou iniciando em programação e tenho um trabalho em C que devo:
       
      Construir um programa que leia uma matriz 7x7 de inteiros.
      Após a leitura, calcular o somatório apenas dos elementos abaixo destacados da matriz lida.
      Mostre, os elementos destacados e o somatório.
       
      A soma deve ser entre as posições da matriz refentes a imagem em anexo. 
      É esta a dificuldade que eu encontrei, não sei os passos para realizar esta soma em específico então provavelmente a minha tentativa abaixo foi bizarra. 
       
      Alguém poderia me ajudar? Agradeço desde já. 
       
      #include<stdio.h> #include<conio.h> #define linha 7 #define coluna 7 int main (void ) { int i, j, matriz[linha][coluna], result, soma; printf ("\nDigite valor para os elementos da matriz\n\n"); for ( i=0; i<linha; i++ ){ for ( j=0; j<coluna; j++ ){ printf ("\nElemento[%d][%d] = ", i, j); scanf ("%d", &matriz[ i ][ j ]); } } for ( i=0; i<linha; i++ ){ for ( j=0; j<coluna; j++ ){ printf ("%i", matriz[i][j]); } printf("\n"); } for ( i=0; i<linha; i++ ){ for ( j=0; j<coluna; j++ ){ result=result+matriz[i][j]; } } for ( i=0; i<linha; i++ ){ for ( j=0; j<coluna; j++ ){ soma=soma+matriz[3][3]+matriz[4][2]+matriz[4][3]+matriz[4][4]+matriz[5][1]+matriz[5][2]+matriz[5][3]+matriz[5][4]+matriz[5][5]+matriz[6][0]+matriz[6][1]+matriz[6][2]+matriz[6][3]+matriz[6][4]+matriz[6][5]+matriz[6][6]; } } printf("\n\nA soma de todos valores da matriz: %d\n", result); printf("\n\nA soma dos valores solicitados: %d\n", soma); }  

    • By calves_oliveira
      Pessoal, não tenho conhecimento em Thread e em Timer mas consegui criar esses dois métodos porém está com um erro e não consigo resolver, a idéia é o seguinte: um classe manda uma jlabel para o método mostraLabel e ele chama o outro método desizaLabel os dois metodos abaixo vai apresentar a mensagem durante 3 segundos e dois deslizar para sair da tela.
      Sei que tem um erro no loop do metodo deslizaLabel pois ele esta com loop infinito mas não consigo tirar… quero que ao jlabel deslizar até o fim do form ele finalize o Thread.
      e também se alguém tiver alguma sugestão de como otimizar esse processo será bem vindo.
      public void mostraLabel(JLabel lbl) { ActionListener action = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { tempo.stop(); deslizaLabel(lbl); } }; tempo = new Timer(3000, action); tempo.start(); } private void deslizaLabel(JLabel lbl){ new Thread(){ @Override public void run(){ int x = 0; int y = lbl.getLocation().y; while(true){ x++; if(x > lbl.getWidth()){ this.stop(); } lbl.setLocation(x,y); try { sleep(10); } catch (InterruptedException ex) { } } } }.start();}  
    • By rogerss_7
      Pessoal, estou participando do desenvolvimento de uma ferramenta com a minha equipe que fará, entre outras, coisas automatizadas por serviços.
       
      Neste contexto eu comecei a notar que algumas estratégias poderiam ser diferentes, como por exemplo processamento paralelo, coisa esta que não está acontecendo.
       
      Vou tentar dar exemplos sem poder mostrar trechos de código reais, pois existem contratos de confidencialidade que poderiam nos levar a multas ou rescisão, acho que vocês entenderão.
       
      1 - Suponha que eu tenha X usuários (logins);
      2 - Pra cada usuário eu tenho que verificar se tem e-mails pra enviar ou arquivos pra processar, entre outros etc.;
       
      // Implementação hipotética
      1 - Existe uma List<Logins> que é iterada por um foreach básico;
      2 - Dentro deste foreach são chamadas as ações que podem acontecer pra cada usuário, mais ou menos assim:
      foreach (var login in logins) {     if (!await _servicoLoginInjetado.LogIn(login))     {         continue;     }     await _servicoLoginInjetado.MandarEmail();     await _servicoLoginInjetado.ProcessarArquivos();     await _servicoLoginInjetado.FazerOutraCoisa(); } É possível notar que existe uma predisposição para async, porém o código não é nada performático, pois itera um a um, não existe paralelismo.
       
      As informações do login (logado) ficam internamente no objeto retornante de _servicoLoginInjetado ... talvez isto também esteja errado.
       
      Gostaria de trocar experiências de possíveis melhorias com vocês.
    • By fabionps
      Pessoal meu professor da faculdade passou trabalho para fazer um programa pra fazer uma calculadora de produto e divisão no python. A pessoa escolhe o que ela vai fazer e depois escolher dois números inteiros.
      OBS.: Não pode usar nenhum comando de laço e só pode usar os operadores aritméticos  +  e/ou  -  
      Não pode usar  *  nem  / 
    • By Mayara Andres
      Olá, preciso implementar um código java usando threads, como o anunciado da atividade pede: 
       
      "O trabalho consiste em alterar o código que busca valores dentro de um vetor (disponível no blackboard) de forma a criar N threads de acordo com a vontade do usuário (ler o número de threads que o usuário deseja criar) e buscar um valor no vetor (apenas 1, também inserido pelo usuário) de forma paralela, ou seja, cada thread criada deve procurar por um região diferente do vetor. Ao final da execução mostre qual foi a thread que encontrou o valor."
       
      PS: EU SÓ QUERO SABER POR ONDE EU COMEÇO, A LÓGICA EU ENTENDI, SÓ NÃO SEI COMO FAZER. 

      classe thread_busca
       
      package trabalho_thread; import java.util.logging.Level; import java.util.logging.Logger; class ThreadBusca extends Thread { private int vetor[]; private int numeroProcurar; public ThreadBusca(int[] vet, int numeroProcurar) { this.vetor = vet; this.numeroProcurar = numeroProcurar; } @Override public void run() { for (int i = 0; i < vetor.length; i++) { if (vetor[i] == numeroProcurar) { System.out.println("Indice de "+numeroProcurar+" eh "+i); return; } try { Thread.sleep(10); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println("Indice de "+numeroProcurar+" eh -1"); } } classe main
      package trabalho_thread; import java.util.Arrays; import java.util.Random; import javax.swing.JOptionPane; public class Main { public static void main(String[] args) { int vet[] = new int[200]; Random random = new Random(); for(int i=0;i<200;i++){ vet[i] = random.nextInt(4999)+1; } System.out.println(Arrays.toString(vet)); int numero=-1; do{ numero = Integer.parseInt(JOptionPane.showInputDialog("Numero a pesquisar:")); new ThreadBusca(vet, numero).start(); }while(numero>0); } }  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.