unvisibleman

Multy threads queens

May 19th, 2014
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <tchar.h>
  3. #include <windows.h>
  4. #define S 8
  5. #define M 2
  6. #define TIME 2
  7. #define _DEBUG_
  8.  
  9. typedef struct{
  10.         int field[S];
  11.         int p;
  12. } sField;
  13.  
  14. int id[M];
  15.  
  16. sField buffer[M];
  17. int buf_size;
  18. sField work[M];
  19.  
  20. HANDLE hMutex,
  21. hBufferFull,
  22. hMutexOut;
  23.  
  24. HANDLE Processes[M]; // олдскульая массив потоков
  25.  
  26. bool Finish = false;
  27. int N = 0; // количество найденных комбинаций
  28.  
  29. void print(int *a){
  30.         WaitForSingleObject(hMutexOut, INFINITE); // входим к критическую секцию
  31. #ifdef _DEBUG_
  32.         printf("Id%d: ", GetCurrentThreadId());
  33.         for (int i = 0; i< S; i++) printf("%d", a[i]);
  34.         printf("\n");
  35. #endif
  36.         N++;
  37.         ReleaseSemaphore(hMutexOut, 1, NULL);
  38. }
  39.  
  40. int test(int p, int *a){
  41.         for (int i = 0; i < p; i++){
  42.                 if (a[i] == a[p]) return 0;
  43.                 if (a[i] - a[p] == p - i || a[p] - a[i] == p - i) return 0;
  44.         }
  45.         return 1;
  46. }
  47. void f(int p, int *a){
  48.     int contin;
  49.  
  50.     if (p == S)
  51.         print(a);
  52.     else {
  53.         for (int i = 0; i < S; i++){
  54.             a[p] = i;
  55.             if (test(p, a)){
  56.                 contin = 1;
  57.                 if (p<2)
  58.                     if (WaitForSingleObject(hMutex, 0) == WAIT_OBJECT_0){
  59.                         // если не нужно долго ждать входа в критическую секцию
  60.                         if (buf_size < M){// и если есть место в буфере, отдаем задание кому-нибудь
  61.                             for (int i = 0; i < S; i++)
  62.                                 buffer[buf_size].field[i] = a[i];
  63.                             buffer[buf_size].p = p + 1;
  64.                             buf_size++;
  65.                             ReleaseSemaphore(hBufferFull, 1, NULL);
  66. #ifdef _DEBUG_
  67.                             printf("Id %d out: %d, %d%d%d%d%d%d%d%d the [%d]-th buf\n", GetCurrentThreadId(), p + 1, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], buf_size - 1);
  68. #endif
  69.                             contin = 0;
  70.                         }
  71.                         ReleaseSemaphore(hMutex, 1, NULL);
  72.                     }
  73.                 if (contin)
  74.                     f(p + 1, a);
  75.             }
  76.         }
  77.     }
  78.     if (p == 0)
  79.         Finish = true;
  80. }
  81.  
  82. DWORD WINAPI Run(LPVOID lpParam){
  83.     int pnum = *((int*)lpParam); // номер процесса
  84.     while (Finish == false || buf_size > 0){
  85.         if (WaitForSingleObject(hBufferFull, TIME) == WAIT_OBJECT_0){
  86.             // дожидаемся появления в буфере (нового) задания
  87.             WaitForSingleObject(hMutex, INFINITE); // входим в критическую секцию
  88.             // копируем задание из буфера в свою рабочую область
  89.             buf_size--;
  90.             for (int i = 0; i<S; i++)
  91.                 work[pnum].field[i] = buffer[buf_size].field[i];
  92.             work[pnum].p = buffer[buf_size].p;
  93. #ifdef _DEBUG_
  94.             printf("Id %d get %d, %d%d%d%d%d%d%d%d the [%d]-th buf\n", GetCurrentThreadId(), work[pnum].p, work[pnum].field[0], work[pnum].field[1], work[pnum].field[2], work[pnum].field[3], work[pnum].field[4], work[pnum].field[5], work[pnum].field[6], work[pnum].field[7], buf_size);
  95. #endif
  96.             ReleaseSemaphore(hMutex, 1, NULL);// выходим из критической секции
  97.             // запускаем решение задачи с этого места
  98.             f(work[pnum].p, work[pnum].field);
  99.         }
  100.     }
  101.     return 0;
  102. }
  103.  
  104. int main(){
  105.         hMutex = CreateSemaphore(NULL, 1, 1, NULL);
  106.         hMutexOut = CreateSemaphore(NULL, 1, 1, NULL);
  107.         hBufferFull = CreateSemaphore(NULL, 0, M, NULL);
  108.        
  109.         buffer[0].p = 0;
  110.         buf_size = 1;
  111.         for (int i = 0; i < M; i++)
  112.             id[i] = i;
  113.         ReleaseSemaphore(hBufferFull, 1, NULL);
  114.         for (int i = 0; i < M; i++)
  115.             Processes[i] = CreateThread(NULL, 0, Run, &id[i], 0, NULL); // вроде мы по другому теперь создаем трэды
  116.         WaitForMultipleObjects(M, Processes, TRUE, INFINITE);
  117.         printf("S = %d\nDetected combinations: %d\nThreads: %d\n", S, N, M);
  118.        
  119.         fgetc(stdin); // задержку мы по-дргому делаем
  120.         return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment