Advertisement
SeventhFleet

Multithreaded Primes

Apr 23rd, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. // MultithreadingPrimeNumbers.cpp : Defines the entry point for the console application.
  2. //Authored by Jared White
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <vector>
  6. #include <fstream>
  7. #include <string>
  8. #include <thread>
  9. using namespace std;
  10.  
  11. //Config
  12. const unsigned char NumberOfThreads = 8;
  13.  
  14. //Vars
  15. unsigned long long int CurrentNumber[NumberOfThreads];      //CurrentNumber, 1 per thread
  16. string MessageQueue[NumberOfThreads];                       //Messages to be written, 1 per thread
  17. vector<unsigned long long int> PrimeNumbers;                //Stores primes to be written to file
  18. const string OutputFileName = "Primes.txt";                 //Filename to write primes to
  19.  
  20. //Prototypes
  21. void CheckForPrime(unsigned long long int Number, const unsigned char ThreadNumber);
  22. void WriteNumber(unsigned long long int Number);
  23. void QueueMessage(unsigned long long int Number, unsigned char Thread, bool IsPrime);
  24. void WritePrimes(void);
  25. void Log(void);
  26.  
  27. //Main program
  28. void CheckForPrime(unsigned long long int Number, const unsigned char ThreadNumber) {
  29.     unsigned int LastDigit = Number % 10;
  30.     if (LastDigit == 0 || (LastDigit % 2 == 0)) {           //Check if even
  31.         QueueMessage(Number, ThreadNumber, false);
  32.         CurrentNumber[ThreadNumber] += NumberOfThreads;
  33.         return;
  34.     }
  35.  
  36.     for (unsigned long long int i = 2; i < Number; i++) {
  37.         if (Number % i == 0) {                              //Not prime, divisible by more than 1 and itself
  38.             QueueMessage(Number, ThreadNumber, false);
  39.             CurrentNumber[ThreadNumber] += NumberOfThreads;
  40.             return;
  41.         }
  42.     }
  43.     //If reached, is prime
  44.     //cout << "\n\n\n\n test \n" << Number << "\n\n\n\n";
  45.     PrimeNumbers.push_back(Number);                         //Add number to vector of nums to be written to file
  46.     QueueMessage(Number, ThreadNumber, true);
  47.     CurrentNumber[ThreadNumber]+=NumberOfThreads;
  48.     return;
  49.  
  50. }
  51.  
  52. void WriteNumber(unsigned long long int Number) {
  53.     ofstream OutputFile;
  54.     OutputFile.open(OutputFileName, ios::app);
  55.     OutputFile << Number << endl;
  56.     OutputFile.close();
  57.     return;
  58. }
  59.  
  60. void QueueMessage(unsigned long long int Number, unsigned char Thread, bool IsPrime) {
  61.     string EndMessage = "Not Prime\n";
  62.     if (IsPrime) { EndMessage = "Is Prime\n"; }
  63.     MessageQueue[Thread] = "[T:" + to_string(Thread) + "][N:" + to_string(Number) + "] " +  EndMessage; //Create message
  64.     return;
  65. }
  66.  
  67. void WritePrimes(void) {
  68.     for each (unsigned long long int Number in PrimeNumbers)
  69.     {
  70.         WriteNumber(Number);
  71.     }
  72.  
  73.     PrimeNumbers.clear();
  74.  
  75.     return;
  76. }
  77.  
  78. void Log(void) {
  79.     for each (string str in MessageQueue)
  80.     {
  81.         cout << str;
  82.     }
  83. }
  84.  
  85. int main()
  86. {
  87.     //remove(OutputFileName.c_str());                                   //Delete file if it already exsists
  88.     thread PrimeThreads[NumberOfThreads];                           //Create threads
  89.     bool Run = true;
  90.     for (int i = 0; i < NumberOfThreads; i++) {
  91.         CurrentNumber[i] = i + 2;                                   //The +2 prevents false positives in the CheckPrime code
  92.     }
  93.  
  94.     while (Run) {
  95.  
  96.         for (unsigned char i = 0; i < NumberOfThreads; i++)         //Set up threads
  97.         {
  98.             PrimeThreads[i] = thread(CheckForPrime, CurrentNumber[i], i);
  99.         }
  100.  
  101.         for (unsigned char i = 0; i < NumberOfThreads; i++) {
  102.             PrimeThreads[i].join();
  103.         }
  104.  
  105.         WritePrimes();                                              //Write primes to file
  106.         Log();                                                      //Log the results of the threads to the console
  107.        
  108.     }
  109.  
  110.    
  111.  
  112.     cin.ignore();
  113.     return 0;
  114.  
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement