Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // MultithreadingPrimeNumbers.cpp : Defines the entry point for the console application.
- //Authored by Jared White
- #include "stdafx.h"
- #include <iostream>
- #include <vector>
- #include <fstream>
- #include <string>
- #include <thread>
- using namespace std;
- //Config
- const unsigned char NumberOfThreads = 8;
- //Vars
- unsigned long long int CurrentNumber[NumberOfThreads]; //CurrentNumber, 1 per thread
- string MessageQueue[NumberOfThreads]; //Messages to be written, 1 per thread
- vector<unsigned long long int> PrimeNumbers; //Stores primes to be written to file
- const string OutputFileName = "Primes.txt"; //Filename to write primes to
- //Prototypes
- void CheckForPrime(unsigned long long int Number, const unsigned char ThreadNumber);
- void WriteNumber(unsigned long long int Number);
- void QueueMessage(unsigned long long int Number, unsigned char Thread, bool IsPrime);
- void WritePrimes(void);
- void Log(void);
- //Main program
- void CheckForPrime(unsigned long long int Number, const unsigned char ThreadNumber) {
- unsigned int LastDigit = Number % 10;
- if (LastDigit == 0 || (LastDigit % 2 == 0)) { //Check if even
- QueueMessage(Number, ThreadNumber, false);
- CurrentNumber[ThreadNumber] += NumberOfThreads;
- return;
- }
- for (unsigned long long int i = 2; i < Number; i++) {
- if (Number % i == 0) { //Not prime, divisible by more than 1 and itself
- QueueMessage(Number, ThreadNumber, false);
- CurrentNumber[ThreadNumber] += NumberOfThreads;
- return;
- }
- }
- //If reached, is prime
- //cout << "\n\n\n\n test \n" << Number << "\n\n\n\n";
- PrimeNumbers.push_back(Number); //Add number to vector of nums to be written to file
- QueueMessage(Number, ThreadNumber, true);
- CurrentNumber[ThreadNumber]+=NumberOfThreads;
- return;
- }
- void WriteNumber(unsigned long long int Number) {
- ofstream OutputFile;
- OutputFile.open(OutputFileName, ios::app);
- OutputFile << Number << endl;
- OutputFile.close();
- return;
- }
- void QueueMessage(unsigned long long int Number, unsigned char Thread, bool IsPrime) {
- string EndMessage = "Not Prime\n";
- if (IsPrime) { EndMessage = "Is Prime\n"; }
- MessageQueue[Thread] = "[T:" + to_string(Thread) + "][N:" + to_string(Number) + "] " + EndMessage; //Create message
- return;
- }
- void WritePrimes(void) {
- for each (unsigned long long int Number in PrimeNumbers)
- {
- WriteNumber(Number);
- }
- PrimeNumbers.clear();
- return;
- }
- void Log(void) {
- for each (string str in MessageQueue)
- {
- cout << str;
- }
- }
- int main()
- {
- //remove(OutputFileName.c_str()); //Delete file if it already exsists
- thread PrimeThreads[NumberOfThreads]; //Create threads
- bool Run = true;
- for (int i = 0; i < NumberOfThreads; i++) {
- CurrentNumber[i] = i + 2; //The +2 prevents false positives in the CheckPrime code
- }
- while (Run) {
- for (unsigned char i = 0; i < NumberOfThreads; i++) //Set up threads
- {
- PrimeThreads[i] = thread(CheckForPrime, CurrentNumber[i], i);
- }
- for (unsigned char i = 0; i < NumberOfThreads; i++) {
- PrimeThreads[i].join();
- }
- WritePrimes(); //Write primes to file
- Log(); //Log the results of the threads to the console
- }
- cin.ignore();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement