dllbridge

Threads

Sep 10th, 2026
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <thread>
  4. #include <numeric>   // std::accumulate
  5.  
  6. // Суммирует диапазон data[from..to) и кладёт ответ в result
  7. void sum_part(const std::vector<int>& data,
  8.               size_t from,
  9.               size_t to,
  10.               long long& result)
  11. {
  12.     result = std::accumulate(data.begin() + from,
  13.                              data.begin() + to,
  14.                              0LL);
  15.  
  16.     std::cout << "Поток завершил диапазон ["
  17.               << from << ", " << to << ")
  18. ";
  19. }
  20.  
  21. int main()
  22. {
  23.     constexpr size_t N = 1'000'000;
  24.     constexpr size_t THREADS = 4;
  25.  
  26.     std::vector<int> data(N);
  27.  
  28.     // Заполним: 1, 2, 3, ..., N
  29.     for (size_t i = 0; i < N; ++i)
  30.         data[i] = static_cast<int>(i + 1);
  31.  
  32.     long long partial[THREADS] = {};  // по отдельной ячейке на поток
  33.     std::thread workers[THREADS];
  34.  
  35.     const size_t block = N / THREADS;
  36.  
  37.     // Запускаем 4 независимые работы
  38.     for (size_t i = 0; i < THREADS; ++i)
  39.     {
  40.         const size_t from = i * block;
  41.         const size_t to = (i == THREADS - 1) ? N : from + block;
  42.  
  43.         workers[i] = std::thread(sum_part,
  44.                                  std::cref(data),
  45.                                  from, to,
  46.                                  std::ref(partial[i]));
  47.     }
  48.  
  49.     // Ждём все рабочие потоки
  50.     for (auto& t : workers)
  51.         t.join();
  52.  
  53.     // Складываем их результаты уже в главном потоке
  54.     long long total = 0;
  55.     for (long long x : partial)
  56.         total += x;
  57.  
  58.     std::cout << "Сумма = " << total << '
  59. ';
  60.  
  61.     // Ожидаемое значение: N * (N + 1) / 2
  62.     std::cout << "Ожидалось = "
  63.               << 1LL * N * (N + 1) / 2 << '
  64. ';
  65. }
Advertisement
Add Comment
Please, Sign In to add comment