*More fully fledged applications can be found on the Products page. The Bash page is dedicated to fully commented oneliners, and a MySQL quick reference is available here.
/* threaded_find_primes.cpp
* - Will Bergen - 2018
* - Simple, trivially threaded exercise. Each thread will try 1000 random numbers
* and report on its progress, or any found primes.
* - Also, *fun with terminal colors*
* - Primes will be between 0 and RAND_MAX
* - compile with: g++ threaded_find_primes.cpp -std=c++11 -g -lpthread
*
*/
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstdint>
#include <math.h>
#include <string>
#include <thread>
using namespace std;
// Thread data passing struct:
struct result
{
int res;
};
void isPrime(uint64_t *n, result &r);
void *doWork(void *r);
int main(int argc, char **argv)
{
// If not enough args:
if (argc < 2)
{
printf("Usage:\n\tfind_primes <#threads>\n");
return 0;
}
// If not a number:
int num_threads;
string s = argv[1];
try {
num_threads = stoi(s);
}
catch(std::invalid_argument& e)
{
printf("Invalid number of threads!\n");
printf("Usage:\n\tfind_primesX <#threads>\n");
return 1;
}
// Go:
pthread_t threads[num_threads];
printf("Starting \033[0;32m%i\033[0m Threads!\n", num_threads);
// Create the Threads:
int i;
int resp;
for (i=0;i<num_threads;++i)
{
resp = pthread_create(&threads[i], NULL, doWork, (void *)(uintptr_t)i);
if (resp)
{
cout << "Error creating thread: " << resp << endl;
} else {
printf("Created \033[1;31mThread %i\033[0m\n", i);
}
}
// Wait for termination:
int j;
for (j=0;j<num_threads;++j)
{
pthread_join(threads[j],NULL);
}
return 0;
}
// Thread:
void *doWork(void *t)
{
// Per thread seed:
srand(time(NULL));
int i;
uint64_t n;
long tid = (long)t;
result r = {0};
for (i=0;i<1000;++i)
{
// Choose a random, reset r:
n = rand();
r.res = 0;
// Test:
isPrime((uint64_t *)n, r);
// Report:
if (r.res == 1)
{
printf("\033[1;31mThread %li\033[0m found prime %lu\n", tid, n);
}
if (i%50 == 0 && i != 0)
{
printf("\033[1;31mThread %li\033[0m has tested %i numbers...\n", tid, i);
}
}
pthread_exit(NULL);
}
// Simple Primality test:
void isPrime(uint64_t *n, result &r)
{
int i;
uint64_t j;
result l_r = {1};
for (i=2;i<=floor((uint64_t)n / 2); ++i)
{
j = i;
if((uint64_t)n%j == 0)
{
// Factor found, not prime!
l_r.res = 0;
break;
}
}
// Update:
r = l_r;
}