Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <windows.h>
- #include <iomanip>
- using namespace std;
- HANDLE* threads;
- HANDLE* events;
- const int N = 10000000;
- const int blockSize = 70000;
- const int maxBlocks = N / blockSize + 1;
- volatile double pi = 0;
- volatile long int blockNum;
- DWORD WINAPI func(LPVOID lpParameter)
- {
- double _pi = 0;
- int num = (int)lpParameter;
- while (true)
- {
- int start = num * blockSize;
- int end = (num + 1)*blockSize;
- if (end > N)
- end = N;
- for (size_t i = start; i < end; i++)
- {
- _pi += 4 / (1 + pow((i + 0.5) / N, 2));
- }
- //cout << "thread finished countin (" << start << ": " << end << ") blocknum is " << blockNum << endl;
- SetEvent(events[(int)lpParameter]);
- num = InterlockedExchangeAdd(&blockNum, 1);
- if (blockNum > maxBlocks)
- break;
- SuspendThread(threads[(int)lpParameter]);
- }
- //cout << "finish" << endl;
- pi += _pi;
- return 0;
- }
- int main()
- {
- int maxThreads;
- int freeThread = NULL;
- cout << "Threads amount: ";
- cin >> maxThreads;
- threads = new HANDLE[maxThreads];
- events = new HANDLE[maxThreads];
- for (size_t i = 0; i < maxThreads; i++)
- {
- threads[i] = CreateThread(NULL, 0, func, (void*)i, CREATE_SUSPENDED, NULL);
- events[i] = CreateEventA(NULL, true, true, NULL);
- }
- blockNum = maxThreads;
- double start = GetTickCount();
- while (blockNum < maxBlocks)
- {
- freeThread = WaitForMultipleObjects(maxThreads, events, false, INFINITE) - WAIT_OBJECT_0;
- //cout << "free thread " << freeThread << "(blockNum is " << blockNum << ")" << endl;
- ResumeThread(threads[freeThread]);
- ResetEvent(events[freeThread]);
- }
- for (size_t i = 0; i < maxThreads; i++)
- {
- ResumeThread(threads[i]);
- }
- WaitForMultipleObjects(maxThreads, threads, true, INFINITE);
- pi = pi / N;
- double end = GetTickCount();
- cout << setprecision(75) << pi << endl;
- cout << "time: " << end - start << " ms" << endl;
- /*for (size_t i = 0; i < maxThreads; i++)
- {
- CloseHandle(threads[i]);
- CloseHandle(events[i]);
- }*/
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement