Search

멀티 쓰레드를 이용한 소수 찾기

Created
tag
#include <algorithm> #include <chrono> #include <iostream> #include <memory> #include <mutex> #include <thread> #include <vector> const int g_max_cnt = 150000; const int g_thread_cnt = 4; bool is_prime(int num) { if (num <= 1) return (false); else if (num == 2 || num == 3) return (true); for (int i = 2; i < num; i++) if (!(num % i)) return (false); return (true); } void print_number(const std::vector<int> &v) { for (auto e : v) std::cout << e << '\t'; } int main(void) { int num = 1; std::vector<int> primes; std::vector<std::shared_ptr<std::thread>> threads; std::recursive_mutex mx_num; std::recursive_mutex mx_prime; auto g_t0 = std::chrono::system_clock::now(); threads.reserve(g_thread_cnt); for (int i = 0; i < g_thread_cnt; i++) { std::shared_ptr<std::thread> t(new std::thread([&]() { while (true) { int n; { std::lock_guard<std::recursive_mutex> lock_num(mx_num); n = num; ++num; } if (n >= g_max_cnt) break; if (is_prime(n)) { std::lock_guard<std::recursive_mutex> lock_prime(mx_prime); primes.push_back(n); } } })); threads.push_back(t); } for (auto t : threads) t->join(); auto g_t1 = std::chrono::system_clock::now(); auto g_duration = std::chrono::duration_cast<std::chrono::milliseconds>(g_t1 - g_t0).count(); std::sort(primes.begin(), primes.end()); print_number(primes); std::cout << '\n' << g_duration << " milliseconds" << '\n'; return (0); }
C++