// First, always include <windows.h> for all the Win32 specific thread information #include <windows.h> #include <iostream.h> #define MAX_THREADS 3 int isprime ; // Prototypes are good and handy, but not necessary in this example. // These three functions are run by each of our three threads // Please note how the functions are declared: // In Win32, thread functions MUST be declared like this: // DWORD WINAPI <name>(LPVOID) // In short, // Return value *must* be DWORD WINAPI // And the parameter must be LPVOID DWORD WINAPI genericThreadFunc1(LPVOID); DWORD WINAPI printString(LPVOID); DWORD WINAPI printNumber(LPVOID); // We need an array of Handles to threads HANDLE hThreads[MAX_THREADS]; // ...an array of thread id's DWORD id[MAX_THREADS]; // And a waiter (which I'll explain later) DWORD waiter; // Here are the three functions that are defined. // They do trivial things and should be mostly self explanatory. DWORD WINAPI genericThreadFunc1(LPVOID n) { cout << "Thread started (genericThreadFunc1)..." << endl; for(int i = 0; i < 100; i++) { cout << "threadFunc1 says: " << i << endl; } cout << "...(genericThreadFunc1) Thread terminating." << endl; return (DWORD)n; } DWORD WINAPI printString(LPVOID n) { cout << "Thread started (printString)..." << endl; // NOTE: In the next line, we make a pointer and cast what was passed in. // This is how you use the LPVOID parameters passed into the // CreateThread call (below). char* str = (char*)n; for(int i = 0; i < 50; i++) { cout << "printString says: " << str << endl; } cout << "...(printString) Thread terminating." << endl; return (DWORD)n; }DWORD WINAPI printNumber(LPVOID n) { int num = (int)n; for( int i = 2 ; i <= n ; i++) { // isprime = 1; //for( int j = 2 ; j <= i ; j++) //if( i == j) // continue; //else if( i % j == 0) //isprime = 0; //} if(isprime) cout<<i<< endl; } //cout << "Thread started (printNumber)..." << endl; //int num = (int)n; //for (int i = num; i < (num + 100); i++) { //cout << "printNumber says: " << i << endl; //} cout << "...(printHello) Thread terminating." << endl; return (DWORD)n; } // Get ready, because here's where all the *REAL* magic happens int main(int argc, char* argv[ ]) { int CONSTANT = 2000, isprime; char myString[20]; strcpy(myString,"Threads are Easy!"); // Here is where we call the CreateThread Win32 API Function that actually // creates and begins execution of a thread. // Please read your help files for what each parameter does on // your Operating system. // Here's some basics: // Parameter 0: Lookup // Parameter 1: Stack size (0 is default which means 1MB) // Parameter 2: The function to run with this thread // Parameter 3: Any parameter that you want to pass to the thread function // Parameter 4: Lookup // Parameter 5: Once thread is created, an id is put in this variable passed in hThreads[0] = CreateThread(NULL,0,genericThreadFunc1,(LPVOID)0,NULL,&id[0]); hThreads[1] = CreateThread(NULL,0,printString,(LPVOID)myString,NULL,&id[1]); hThreads[2] = CreateThread(NULL,0,printNumber,(LPVOID)CONSTANT,NULL,&id[2]);// Now that all three threads are created and running, we need to stop the primary thread // (which is this program itself - Remember that once "main" returns, our program exits) // So that our threads have time to finish. To do this, we do what is called "Blocking". // We're going to make main just stop and wait until all three threads are done. // This is done easily with the next line of code. Please read the help file about // the specific API call "WaitForMultipleObjects". waiter = WaitForMultipleObjects(MAX_THREADS, hThreads, TRUE, INFINITE); // After all three threads have finished their task, "main" resumes and we're now ready // to close the handles of the threads. This is just a bit of clean up work. // Use the CloseHandle (API) function to do this. (Look it up in the help files as well) for(int i = 0; i < MAX_THREADS; i++) { CloseHandle(hThreads[i]); } system ("pause"); return 0; }
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
}