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 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); } }  
    • By BCG97
      segue a baixo a questão, a minha duvida é o seguinte, como fazer a soma dos valores recebidos... onde coloca-los para receber o valor certinho, como diz na questão que cada fileira tem um valor, isso eu não entendi ainda
       
      A faculdade X pensou em montar um projeto para ajudar os acadêmicos de Engenharia da Computação a levantar dinheiro para sua formatura, a faculdade agora montou uma armário 2 linhas e 13 colunas, ou seja dois andares de armários até 13 totalizando 26 armários disponíveis.

      Sua tarefa agora é desenvolver um controle para uso de moedas para utilizar os armários.

       
       

       
      O valor determinado para cada armário é:

      Armários da fileira debaixo custam R$ 0,50

      Armários da fileira superior R$ 1,00.

      A cada armário mais distante do canto inicial é adicionado R$ 0,10 no valor.


       
      Seu programa deverá ter as funcionalidades abaixo:

      1 –  Exibir todos os armários identificando disponíveis e ocupados.

      2 –  Exibir todos os armários e o valor recebido até então.

      3 –  Utilizar armário. Para utilizar o armário deverá informar seu número da linha e da coluna. Se estiver sendo utilizado deve informar: ARMARIO OCUPADO.

      4 –  Liberar armário. Para liberar o armário deverá informar seu número da linha e da coluna. Se estiver vago deve informar: ARMARIO JÁ ESTA VAGO.

      5 –  Realizar recebimento. (Nesta funcionalidade você terá que zerar os valores recebidos e contabilizar quanto foi lucrado).

      6 – Sair. (Só poderá sair se todos os armários estiverem desocupados, ou seja, deverá realizar o recebimento antes de sair).

×

Important Information

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