// OPT: -lpthread #include #include #include #include #include #include #include using namespace std; using namespace std::chrono; // thread pool to calculate primality of a set of numbers in parallel class primeprocessor { public: void addproc(int nthread) { for(int i=0;idowork(i); }); } void dowork(int tnum) { int myind; long long mynum; while(1) { { unique_lock inlock(inmutex); while(inputs.empty()) incond.wait(inlock); // incond.wait(inlock, // can add timeout here // [inputs]{ return !inputs.empty() }); myind = inputs.size()-1; mynum = inputs.back(); inputs.pop_back(); } bool ans = true; // Here's the work: not a smart algorithm :( for(long long i=2;mynum>i*i;i++) if (mynum % i == 0) { ans = false; break; } { lock_guard outlock(outmutex); outputs[myind] = ans; } nfinished++; } } vector areprimes(vector x) { { unique_lock inlock(inmutex,defer_lock); unique_lock outlock(outmutex,defer_lock); lock(inlock,outlock); inputs = x; outputs.resize(inputs.size()); nfinished = 0; } for(;;) { incond.notify_all(); // also notify_one which wakes at least 1 this_thread::sleep_for(milliseconds(50)); { if (nfinished==x.size()) break; } } return outputs; } private: vector tpool; vector inputs; vector outputs; atomic nfinished; mutex inmutex,outmutex; condition_variable incond; }; int main(int argc, char **argv) { primeprocessor pp; pp.addproc(4); vector list1 {275604547, 275875889, 4, 3, 99809363, 23, 15485863, 5600056}; vector list2; ifstream primef("1000primes.txt"); for(int i=0;i<1000;i++) { long long l; primef >> l; list2.push_back(l); } vector list3; ifstream primef2("largeprimes.txt"); for(int i=0;i<64;i++) { long long l; primef2 >> l; list3.push_back(l); } for(bool b : pp.areprimes(list1)) cout << b << ' '; cout << endl; cout << endl; for(bool b : pp.areprimes(list2)) cout << b << ' '; cout << endl; cout << endl; for(bool b : pp.areprimes(list3)) cout << b << ' '; cout << endl; }