#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++