Main / CoursesAAMultiThreadingLinux
NOTE: I compile using g++ t.cc -lpthread -lrt
#include <iostream> #include <pthread.h> #include <math.h> using namespace std; // Stores the arguments passed around in the code below. struct Args { pthread_mutex_t* mutex; int thread_num; double start; double end; double sum; Args(pthread_mutex_t* _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(void* p) { Args* args = (Args *) p; // We print the following message under mutex lock so it is not interrupted. pthread_mutex_lock (args->mutex); cout << "Starting thread: " << args->thread_num << " sum range " << args->start << " to " << args->end << endl; pthread_mutex_unlock (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(pthread_mutex_t* mutex, double max) { Args args0(mutex, 0, 0, max); GetSum(&args0); cout << "Single Threaded - Sum: " << args0.sum << endl << endl; } void Run2Threads(pthread_mutex_t* mutex, double max) { pthread_t tid[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. pthread_create(&(tid[0]), NULL, &GetSum, &args0); pthread_create(&(tid[1]), NULL, &GetSum, &args1); // Waits until both threads are done. pthread_join(tid[0], NULL); pthread_join(tid[1], NULL); // Total the partial sums from the two threads and output the result. cout << "Multithreaded - Sum: " << args0.sum + args1.sum << endl << endl; } int main(int argc, char* argv[]) { double max = 3e8; pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL); double start = (double) clock() / (double) CLOCKS_PER_SEC; RunSingleThread(&mutex, max); double end_single = (double) clock() / (double) CLOCKS_PER_SEC; Run2Threads(&mutex, max); double end_dual = (double) clock() / (double) CLOCKS_PER_SEC; pthread_mutex_destroy(&mutex); cout << end_single - start << " s (single thread) " << endl << (end_dual - end_single) / 2 << " s (dual threads) " << endl; return 0; }