#include <iostream>
#include <stdio.h>
//include <windows.h>
using namespace std;
const int MAX = 10000;
struct prArray
{
int pStart, pEnd, pTest, pCount;
int tArray[MAX];
};
int check_prime(int);
DWORD WINAPI primer(LPVOID lpParam);
int main()
{
/* by having these 2 variables + the struct, error checkin is made easier*/
int one, two, diff, temp, end1, start2;
cout << " START:\n";
cin >> one;
cin >> two;
prArray ash;
prArray jeff;
diff = (two - one); // get the difference between the start and end values
temp = diff / 2; // use this to divide the work evenly among the threads
end1 = one + temp; // end value for first thread
start2 = end1 + 1; // begin 1 number after the end of first thread
// set the struct values
ash.pStart = one; // equal to the first number of the range e.g. 1 - 10000 --> 1
ash.pEnd = one + temp; // equal to halfway between the range e.g. 5000
ash.pCount = ash.pStart;
jeff.pStart = start2; // equal to next number after halfway e.g. 5001
jeff.pEnd = two; // equal to last number of the range e.g. 10000
jeff.pCount = jeff.pStart;
//create first thread
DWORD myThreadID1;
HANDLE myHandle = CreateThread(
NULL, // security
0, // stack size
primer, // function to perform
&ash, // function parameter --> pass the struct
0, // creation flag
&myThreadID1); // thread id
//create second thread
DWORD myThreadID2;
HANDLE myHandle2 = CreateThread(
0,
0,
primer,
&jeff,
0,
&myThreadID2);
// close the threads
CloseHandle(myHandle);
CloseHandle(myHandle2);
// print stuff out
cout << endl << endl;
cout << " BACK TO main()\n";
// begin with first struct (ash)
cout << "\n THREAD1: \n";
cout << "Thread1 starting point: " << ash.pStart << endl;
cout << "Thread1 ending point: " << ash.pEnd << endl;
cout << "Test: " << ash.pTest << endl;
int i1;
for (i1 = 0; i1 < MAX; i1++) // print array values for first struct (ash)
{
if (ash.tArray[i1] == 0)
{
break;
}
else
{
cout << ash.tArray[i1] << " ";
}
}
//begin second thread (jeff)
cout << endl << endl;
cout << " THREAD2: " << endl;
cout << "Thread2 starting point: " << jeff.pStart << endl;
cout << "Thread2 ending point: " << jeff.pEnd << endl;
cout << "Test: " << jeff.pTest << endl;
int js;
for (js = 0; js < MAX; js++) // print array values for second struct (jeff)
{
if (jeff.tArray[js] == 0)
{
break;
}
else
{
cout << jeff.tArray[js] << " ";
}
}
cout << "\n first = " << i1 << endl;
cout << " second = " << js << endl;
cout << "Thread 1 counter = " << ash.pCount << endl;
cout << "Thread 2 counter = " << jeff.pCount << endl;
cout << "\n END PROGRAM" << endl;
system("pause");
return 0;
}
// ============= END OF main() ==============
/** ============ CHECK FOR PRIME ============= */
int check_prime(int a)
{
int c;
if ( a == 2 || a == 3 || a == 5 || a ==7) //check if the number is 2
{
return 1;
}
else if (a % 2 == 0 || a % 3 == 0 || a % 5 == 0 || a % 7 == 0) //check if the number is even
{
return 0;
}
else //for odd numbers, check if they are prime
{
for (c = 11; c <= a - 1; c+=2)
{
if (a%c == 0)
return 0;
}
if ( c == a)
return 1;
}
}
/** ============ END CHECK PRIME============== */
/** ============ THREAD ===================== */
DWORD WINAPI primer(LPVOID lpParam)
{
prArray& dan = *(prArray*)lpParam; /*working initialization */
dan.pTest = (dan.pEnd - dan.pStart);
// initialize the array to "0"
for (int i = 0; i < MAX; i++)
{
dan.tArray[i] = 0;
}
int b = 0;
for (int lp = dan.pStart; lp <= dan.pEnd; lp++, dan.pCount++)
{
int result3 = check_prime(lp);
if (result3 == 1)
{
dan.tArray[b] = lp;
b++;
}
}
}
/** ================END THREAD =================*/ Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++ and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}