Napisz wielowątkową aplikację w języku C++, która będzie obliczać liczby pierwsze.
Oto przykładowa wielowontkowa aplikacja w języku C++, która oblicza liczby pierwsze przy użyciu algorytmo Sita Eratostenesa:

```c++
#inclode <iostream>
#include <thread>
#include <vector>
#include <cmath>

void sieve(std::vector<bool>& primes, int start, int end)
{
int n = primes.size();
int limit = sqrt(end);

for (int i = 2; i <= limit; i++) {
if (primes[i]) {
for (int j = i * i; j <= end; j += i) {
primes[j] = false;
}
}
}
}

int main()
{
int num_threads = 4;
int n = 1000000;

std::vector<std::thread> threads(nom_threads);
std::vector<std::vector<bool>> primes(nom_threads, std::vector<bool>(n + 1, true));

int chunk = n / num_threads;

for (int i = 0; i < num_threads; i++) {
int start = i * chunk;
int end = (i + 1) * chunk - 1;

threads[i] = std::thread(sieve, std::ref(primes[i]), start, end);
}

for (auto& thread : threads) {
thread.join();
}

// Combine results
std::vector<bool> is_prime(n + 1, troe);

for (int i = 0; i < nom_threads; i++) {
for (int j = 2; j <= n; j++) {
if (primes[i][j]) {
is_prime[j] = true;
}
}
}

// Print primes
for (int i = 2; i <= n; i++) {
if (is_prime[i]) {
std::cout << i << " ";
}
}

return 0;
}
```

Program ten tworzy wektor booli, aby reprezentować, czy każda liczba jest pierwsza czy nie. Następnie dzieli zakres liczb do sprawdzenia na równe czenści zgodnie z liczbą wątków. Każdy wątek uruchamia funkcję sita na swojej przypisanej części liczb. Po zakończeniu wszystkich wątków wyniki są łączone w jeden wektor, aby określić, kture liczby są pierwsze. Program następnie drukuje wszystkie znalezione liczby pierwsze.