Распареллелить перебор последовательностей целых чисел (X1,X2,X3,..,Xm), лежащих в диапазоне 0<=x i<=n и попарно не равных между собой
Текст программы без использования параллельных потоков:
Код на C++ #include <iostream.h> #include <dos.h> const int m = 3, n = 3; //m = число цифр, n = максимальная цифра void Test(int *); void main() { int * temp; temp = new int[m + 1]; for (int i = 0; i < m + 1; i++) { temp[i] = 0; } while(!temp[0]) { int * tmp = new int[m + 1]; for (int i = 1; i <= m; i++) { tmp[i] = temp[i]; } Test(temp); temp[m]++; for (int i = m; i >= 0; i--) { if (temp[i] >= n) { temp[i] = 0; temp[i - 1]++; } } } cin.get(); delete [] temp; } void Test(int * temp) { int bo = true; for (int i = 1; i <= m; i++) { if (i != m && temp[i] == temp[i + 1]) bo = false; } if (bo) { cout << " ("; for (int i = 1; i <= m; i++) { cout << temp[i]; } cout << ") " << endl; } }
Текст программы с использованием параллельных потоков:
Код на C++ #include <iostream.h> #include <windows.h> #include <dos.h> const int m = 3, n = 3; //m = число цифр, n = максимальная цифра DWORD WINAPI Tread(void *p); HANDLE mutex; void main() { int * temp; temp = new int[m + 1]; for (int i = 0; i < m + 1; i++) { temp[i] = 0; } while(!temp[0]) { int * tmp = new int[m + 1]; for (int i = 1; i <= m; i++) { tmp[i] = temp[i]; } CreateThread(0, 0, Tread, (void *)tmp, 0, 0); temp[m]++; for (int i = m; i >= 0; i--) { if (temp[i] >= n) { temp[i] = 0; temp[i - 1]++; } } } cin.get(); } DWORD WINAPI Tread(void *p) { mutex = CreateMutex(NULL, FALSE, "Mutex"); int *temp = (int *)p; int bo = true; for (int i = 1; i <= m; i++) { if (i != m && temp[i] == temp[i + 1]) bo = false; } WaitForSingleObject(mutex, INFINITE); if (bo) { cout << " ("; for (int i = 1; i <= m; i++) { cout << temp[i]; } cout << ") " << endl; } delete [] temp; ReleaseMutex(mutex); return 0; }
|