fork(2) download
  1. #include <iostream>
  2. #include <iterator>
  3. #include <algorithm>
  4. #include <numeric>
  5. #include <thread>
  6. #include <vector>
  7.  
  8.  
  9. std::size_t count_needle(int * first, int *const last,
  10. int const* needleFirst, int const* const needleLast) {
  11. std::sort(first, last);
  12.  
  13. std::size_t count = 0;
  14. while (first != last && needleFirst != needleLast) {
  15. if (*first == *needleFirst) {
  16. ++count;
  17. ++first;
  18. } else if (*needleFirst < *first) {
  19. ++needleFirst;
  20. } else {
  21. ++first;
  22. }
  23. }
  24.  
  25. return count;
  26. }
  27.  
  28.  
  29. int main()
  30. {
  31. int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
  32. int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
  33.  
  34. std::sort(std::begin(arraySecond), std::end(arraySecond));
  35. auto const arraySecondEnd = std::unique(std::begin(arraySecond), std::end(arraySecond));
  36.  
  37. auto const numThreads = std::thread::hardware_concurrency();
  38. std::vector<std::thread> tasks;
  39. tasks.reserve(numThreads);
  40. std::vector<size_t> results(numThreads);
  41.  
  42. auto const firstSize = sizeof(arrayFirst) / sizeof(*arrayFirst);
  43. auto const firstStep = (firstSize + numThreads - 1) / numThreads;
  44.  
  45. for (std::size_t i = 0; i != numThreads; ++i) {
  46. auto const firstBegin = arrayFirst + i * firstStep;
  47. auto const firstEnd = arrayFirst + std::min((i + 1) * firstStep, firstSize);
  48.  
  49. std::thread task([=, &results] () {
  50. results[i] = count_needle(firstBegin, firstEnd, arraySecond, arraySecondEnd);
  51. });
  52. tasks.push_back(std::move(task));
  53. }
  54.  
  55. for (auto & task : tasks) {
  56. task.join();
  57. }
  58.  
  59. auto const count = std::accumulate(std::begin(results), std::end(results), std::size_t(0));
  60.  
  61. std::cout << count << std::endl;
  62. }
Success #stdin #stdout 0s 23456KB
stdin
Standard input is empty
stdout
8