#include #include #include #include #include #include #include using namespace std; class AdderThread: public QThread { public: AdderThread(int * a, int f, int l) { array = a; first = f; last = l; } void addElement(int v) { mutex.lock(); sum += v; mutex.unlock(); } void run() { for (int cnt = first; cnt <= last; cnt ++) { addElement(array[cnt]); } } int getSum() const { return sum; } private: QMutex mutex; int * array; int first; int last; static long sum; }; long AdderThread::sum = 0; // initialize int main(int argc, char* argv[]) { int arraySize = 1000000; int * dataArray = new int[arraySize]; long actualSum = 0; for (int cnt = 0; cnt < arraySize; cnt ++) { // initialize the elements to 1, 2, 3, ... dataArray[cnt] = cnt; // cout << dataArray[cnt] << endl; actualSum += dataArray[cnt]; } const int numThread = 4; // this is always a factor of arraySize AdderThread * * thrd = new AdderThread * [numThread]; int first = 0; int last; for (int cnt = 0; cnt < numThread; cnt ++) { last = first + arraySize / numThread - 1; // cout << first << " " << last << endl; thrd[cnt] = new AdderThread(dataArray, first, last); first = last + 1; } for (int cnt = 0; cnt < numThread; cnt ++) { thrd[cnt] -> start(); } for (int cnt = 0; cnt < numThread; cnt ++) { thrd[cnt] -> wait(); } cout << "The sum by threads is " << thrd[0] -> getSum() << endl; cout << "The actual sum is " << actualSum << endl; for (int cnt = 0; cnt < numThread; cnt ++) { delete thrd[cnt]; } delete [] thrd; delete [] dataArray; return 0; }