Main / CoursesAAMultiThreadingWindows
Very simple c++ program that demonstrates how to create and execute threads in Windows. I compile and run as a win32 console application in Visual C++ Express 2010.
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
// Stores the arguments passed around in the code below.
struct Args {
HANDLE mutex;
int thread_num;
double start;
double end;
double sum;
Args(HANDLE _mutex, int _thread_num, double _start, double _end)
: mutex(_mutex), thread_num(_thread_num), start(_start), end(_end), sum(0) {
}
};
// Adds up the numbers (increments of 1) from start to end.
void GetSum(Args* args) {
// We print the following message under mutex lock so it is not interrupted.
WaitForSingleObject(args->mutex, INFINITE);
cout << "Starting thread: " << args->thread_num << " sum range "
<< args->start << " to " << args->end << endl;
ReleaseMutex(args->mutex);
for (double i = args->start; i < args->end; i++) {
// Print out our progress. We don't bother mutex locking here.
if (fmod(i, 1e7) < 0.1) {
cout << "T(" << args->thread_num << ") at: " << i << endl;
}
args->sum += i;
}
}
void RunSingleThread(HANDLE mutex, double max) {
Args args0(mutex, 0, 0, max);
GetSum(&args0);
cout << "Single Threaded - Sum: " << args0.sum << endl << endl;
}
void Run2Threads(HANDLE mutex, double max) {
HANDLE thread[2];
Args args0(mutex, 0, 0, max / 2);
Args args1(mutex, 1, max / 2 + 1, max);
// Create and start two separate threads to compute the sums.
thread[0] = (HANDLE)_beginthread((void(*)(void*))GetSum, 0, (void*)&args0);
thread[1] = (HANDLE)_beginthread((void(*)(void*))GetSum, 0, (void*)&args1);
// This waits until both threads are done.
WaitForMultipleObjects(2, thread, TRUE, INFINITE);
// Total the partial sums from the two threads and output the result.
cout << "Multithreaded - Sum: " << args0.sum + args1.sum << endl << endl;
}
int _tmain(int argc, _TCHAR* argv[]) {
double max = 3e8;
HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
DWORD start = GetTickCount();
RunSingleThread(mutex, max);
DWORD end_single = GetTickCount();
Run2Threads(mutex, max);
DWORD end_dual = GetTickCount();
cout << end_single - start << " ms (single thread) " << endl
<< end_dual - end_single << " ms (dual threads) " << endl;
return 0;
}

