Informazioni thread.

di il
9 risposte

Informazioni thread.

Salve, sapreste dirmi se più thread posso lavorare insieme per uno scopo comune? per esempio eseguire una singola operazione ma dividendosi i compiti eseguendola più velocemente.
Online e dal mio libro non riesco a trovare la risposta, vedo operazioni multi thread ma per metodi differenti e non per uno scopo comune.
Grazie in anticipo!

9 Risposte

  • Re: Informazioni thread.

    Dipende dall'operazione cge vuoi eseguire e se esistono parti indipendenti. Comunque devi sincronizzare le operazioni non è automatico...
  • Re: Informazioni thread.

    Si puo' fare TUTTO, ma per farlo serve SAPERE come fare.
    Ci sono n-mila casi e per ogni caso k-mila soluzioni.

    Comunque, il concetto e'
    Se ho una cpu sta' T secondi per fare qualcosa, IN TEORIA DUE cpu, che lavorano su 1/2 dei dati, stanno T/2 secondi ogn'una, ma poiche' vanno in parallelo, il risultato lo ottieni in T/2 secondi.

    Con 4 in T/4, con 10 in T/10

    IN TEORIA.

    In pratica i casini sono tanti, milioni di milioni come la stella di Negroni
  • Re: Informazioni thread.

    Grazie mille delle risposte.

    oregon ha scritto:


    Dipende dall'operazione cge vuoi eseguire e se esistono parti indipendenti. Comunque devi sincronizzare le operazioni non è automatico...
    Quindi dovrei manualmente andare diciamo a suddividere l'operazione base per i vari thread?
    Esempio molto stupido: Devo prelevare 100 righe da un file txt ma voglio che siano due thread diversi a farlo, dico al primo thread di prendere le prime 50 righe ed al secondo thread le altre 50.
  • Re: Informazioni thread.

    È l'esempio sbagliato: la memoria di massa non funziona in parallelo.

    quello che potresti fare, ad esempio, è cercare il massimo in un certo vettore X di dimensione n
    farai due thread, uno per le prime n/2 righe, il secondo per le ultime n/2
    poi confronterai i due valori, per trovare il massimo.

    Ovviamente neppure l'accesso alla memoria funziona in parallelo, comunque grosso modo così ti fai un'idea
  • Re: Informazioni thread.

    Programmazione parallela - argomento lungo

    https://docs.microsoft.com/it-it/dotnet/standard/parallel-programming/
    Parallel.ForEach(
        listOfWebpages,
        new ParallelOptions { MaxDegreeOfParallelism = 4 },
        webpage => { Download(webpage); }
    );
  • Re: Informazioni thread.

    Ecco un esempio semplicissimo:
    
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace MultiThreading
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                int[] b = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
                int[] c = new int[10];
    
                int i1=0, i2=5, i3=10;
    
                List<Task> tasks = new List<Task>();
                {
                    tasks.Add(Task.Run(() =>
                    {
                        for (int i = i1; i < i2; i++)
                            c[i] = a[i] + b[i];
                    }));
                    tasks.Add(Task.Run(() =>
                    {
                        for (int j = i2; j < i3; j++)
                            c[j] = a[j] + b[j];
                    }));
                }
                Task.WaitAll(tasks.ToArray());
    
                for (int i = 0; i < i3 ; i++)          
                    Console.Write($"{c[i]}, ");
                Console.WriteLine();
            }
        }
    }
    
    
    
  • Re: Informazioni thread.

    Posso approfittare? più che una domanda è un consiglio. Ho capito la differenza tra async e thread.
    Però non ho capito la differenza tra thread e task.
    Devo studiare prima i thread... o prima i task? non ho un problema. voglio solo cercare di imparare.
    prima di imparare a moltiplicare bisogna imparare a sommare. Ma è anche vero che la somma è la sottrazione stanno su uno stesso livello.

    Ecco. non riesco a capire tra task e thread chi viene prima. o se sono sullo stesso livello.
    Se mi mandate anche qualche link ve ne sono grato.

    P.S.
    mi sto esercitando guardando gli esempi fatti in CONSOLLE.
    Ma quando vado a fare qualcosa con i form si incasina tutto perche dice che i controlli appartengono a un altro processo.

    Che casino

    Ciao.
  • Re: Informazioni thread.

    Il 'task oriented programming' e' un paradigma di programmazione un po' piu' sofisticato dei thread, ma comunque si basa sui thread.

    Si basa sun un threadpool, cioe' una serie di thread perennemente in attesa di fare qualcosa.

    Il thread pool ha una coda dove tu infili i task da processare,e i thread sono perennemente in attesa di pescare qualcosa da eseguire dalla coda.

    E' un modo un po' piu' intelligente di usare i thread, MA i task devono essere CPU intensivi, cioe' non devono mettersi in attesa di I/O da disco o da rete, .

    Quindi PRIMA thread POI task.
  • Re: Informazioni thread.

    STAddo ha scritto:


    Grazie mille delle risposte.

    oregon ha scritto:


    Dipende dall'operazione cge vuoi eseguire e se esistono parti indipendenti. Comunque devi sincronizzare le operazioni non è automatico...
    Quindi dovrei manualmente andare diciamo a suddividere l'operazione base per i vari thread?
    Esempio molto stupido: Devo prelevare 100 righe da un file txt ma voglio che siano due thread diversi a farlo, dico al primo thread di prendere le prime 50 righe ed al secondo thread le altre 50.
    Quando il compito è scomponibile e non si fa accesso alla stessa risorsa, si.
    Se calcoli una funzione grafica complessa, tipo mandelbrot, puoi far eseguire metà del compito ad un thread, e l'altra metà ad un'altro thread. la funzione verrà calcolata in metà del tempo. I successivi raddoppi dei thread, non producono raddoppi di prestazioni, dipende dalla CPU.
Devi accedere o registrarti per scrivere nel forum
9 risposte