Распареллелить перебор последовательностей целых чисел (X1,X2,X3,..,Xm), лежащих в диапазоне 0<=x i<=n и попарно не равных между собой


Добавил:DMT
Дата создания:23 апреля 2008, 20:21
Дата обновления:23 апреля 2008, 20:22
Просмотров:9403 последний сегодня, 23:30
Комментариев: 0

Распареллелить перебор последовательностей целых чисел (X1,X2,X3,..,Xm), лежащих в диапазоне 0<=x i<=n и попарно не равных между собой

Текст программы без использования параллельных потоков:

Код на C++
  1. #include <iostream.h>
  2. #include <dos.h>
  3.  
  4. const int m = 3, n = 3; //m = число цифр, n = максимальная цифра
  5.  
  6. void Test(int *);
  7.  
  8. void main()
  9. {
  10. int * temp;
  11. temp = new int[m + 1];
  12. for (int i = 0; i < m + 1; i++)
  13. {
  14. temp[i] = 0;
  15. }
  16. while(!temp[0])
  17. {
  18. int * tmp = new int[m + 1];
  19. for (int i = 1; i <= m; i++)
  20. {
  21. tmp[i] = temp[i];
  22. }
  23.  
  24. Test(temp);
  25.  
  26. temp[m]++;
  27. for (int i = m; i >= 0; i--)
  28. {
  29. if (temp[i] >= n)
  30. {
  31. temp[i] = 0;
  32. temp[i - 1]++;
  33. }
  34. }
  35. }
  36. cin.get();
  37. delete [] temp;
  38. }
  39.  
  40. void Test(int * temp)
  41. {
  42. int bo = true;
  43. for (int i = 1; i <= m; i++)
  44. {
  45. if (i != m && temp[i] == temp[i + 1])
  46. bo = false;
  47. }
  48. if (bo)
  49. {
  50. cout << " (";
  51. for (int i = 1; i <= m; i++)
  52. {
  53. cout << temp[i];
  54. }
  55. cout << ") " << endl;
  56. }
  57. }
При использовании обязательна ссылка на http://DMTSoft.ru

Текст программы с использованием параллельных потоков:

Код на C++
  1. #include <iostream.h>
  2. #include <windows.h>
  3. #include <dos.h>
  4.  
  5. const int m = 3, n = 3; //m = число цифр, n = максимальная цифра
  6.  
  7. DWORD WINAPI Tread(void *p);
  8. HANDLE mutex;
  9.  
  10. void main()
  11. {
  12. int * temp;
  13. temp = new int[m + 1];
  14. for (int i = 0; i < m + 1; i++)
  15. {
  16. temp[i] = 0;
  17. }
  18. while(!temp[0])
  19. {
  20. int * tmp = new int[m + 1];
  21. for (int i = 1; i <= m; i++)
  22. {
  23. tmp[i] = temp[i];
  24. }
  25.  
  26. CreateThread(0, 0, Tread, (void *)tmp, 0, 0);
  27.  
  28. temp[m]++;
  29. for (int i = m; i >= 0; i--)
  30. {
  31. if (temp[i] >= n)
  32. {
  33. temp[i] = 0;
  34. temp[i - 1]++;
  35. }
  36. }
  37. }
  38. cin.get();
  39. }
  40.  
  41. DWORD WINAPI Tread(void *p)
  42. {
  43. mutex = CreateMutex(NULL, FALSE, "Mutex");
  44. int *temp = (int *)p;
  45. int bo = true;
  46. for (int i = 1; i <= m; i++)
  47. {
  48. if (i != m && temp[i] == temp[i + 1])
  49. bo = false;
  50. }
  51. WaitForSingleObject(mutex, INFINITE);
  52. if (bo)
  53. {
  54. cout << " (";
  55. for (int i = 1; i <= m; i++)
  56. {
  57. cout << temp[i];
  58. }
  59. cout << ") " << endl;
  60. }
  61. delete [] temp;
  62. ReleaseMutex(mutex);
  63. return 0;
  64. }
При использовании обязательна ссылка на http://DMTSoft.ru
up