fcamuso

Threads - D/2

Jun 20th, 2021
698
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.IO;
  3. using System.Threading;
  4.  
  5. namespace Threads_B
  6. {
  7.   class Program
  8.   {
  9.     static readonly object lucchetto = new object();
  10.  
  11.     static double CalcolaSomma(double[] v, int quanti)
  12.     {
  13.       double somma = 0;
  14.       double sommaParziale = 0;
  15.  
  16.       for (int segmento = 0; segmento < 4; segmento++)
  17.       {
  18.         sommaParziale = 0;
  19.         for (int i = 25000000 * segmento; i < 25000000 * (segmento + 1); i++)
  20.           sommaParziale += v[i];
  21.         somma += sommaParziale;
  22.       }
  23.       return somma;
  24.     }
  25.  
  26.     static void CalcolaSommaThread(double[] v, int da, int quanti, ref double somma)
  27.     {
  28.       double sommaParziale = 0;
  29.  
  30.       for (int i = da; i < da + quanti; i++) sommaParziale += v[i];
  31.      
  32.       lock (lucchetto)
  33.       {
  34.         somma += sommaParziale;
  35.       }
  36.      
  37.       Console.WriteLine($"Da indice {da} fino a indice {da + quanti - 1}");
  38.     }
  39.  
  40.     static void Main(string[] args)
  41.     {
  42.       int quanti = 100000000;
  43.       double[] v = new double[quanti];
  44.       double somma = 0;
  45.  
  46.       Random generatore = new Random();
  47.       for (int i = 0; i < quanti; i++) v[i] = generatore.NextDouble() * 10;
  48.  
  49.       DateTime start = DateTime.Now;
  50.       somma = CalcolaSomma(v, quanti);
  51.       Console.WriteLine($"Somma: {somma}");
  52.  
  53.       DateTime end = DateTime.Now;
  54.       Console.WriteLine((end - start).TotalMilliseconds);
  55.  
  56.       somma = 0;
  57.       Thread[] threads = new Thread[4];
  58.  
  59.       start = DateTime.Now;
  60.  
  61.       for (int i = 0; i < 4; i++)
  62.       {
  63.         int parti_da = i;
  64.         threads[i] = new Thread(() => CalcolaSommaThread(v, parti_da * 25000000, 25000000,ref somma));
  65.         threads[i].Start();
  66.         //threads[i].Join();
  67.       }
  68.      
  69.       foreach (Thread t in threads) t.Join();
  70.       end = DateTime.Now;
  71.      
  72.       Console.WriteLine((end - start).TotalMilliseconds);
  73.       Console.WriteLine($"Somma: {somma}");
  74.     }
  75.   }
  76. }
  77.  
RAW Paste Data