Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <time.h>
  4. #include <thread>
  5. #include <mutex>
  6. #include <string>
  7. #include <Windows.h>
  8. #include <condition_variable>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. /*Sekcja krytczyna (ang. critical section) jest to wydzielony fragment kodu, który nie może być wykonywany równolegle w programie wielowątkowym.
  14.  
  15. Sekcje krytyczne stosuje się w celu zapewnienia bezpiecznego dostępu do współdzielonych danych, znajdujących się w pamięci. */
  16.  
  17. mutex obiekt;
  18. mutex mtx;
  19. condition_variable cv;
  20. //mutex **semafory;
  21. int suma=-1;
  22. bool ready=false;
  23. bool koniec=false;
  24. int Number=0;
  25.  
  26. struct Value{
  27. string kto;
  28. int x;
  29. int y;
  30. int liczba;
  31. };
  32.  
  33. vector<Value>tablica;
  34.  
  35. int f(int n, int x, int y)
  36. {
  37. return (x + y*2 + 1)%n;
  38. }
  39.  
  40. void Wpisz_Rozwiazanie(int liczba,string kto){
  41.  
  42. obiekt.lock();
  43. suma=liczba;
  44. cout<<"Rozwiazanie wprowadzil "<<kto<<". Suma = "<<suma<<endl;
  45. obiekt.unlock();
  46. }
  47.  
  48. void logi(){
  49.  
  50. for(int i=0;i<tablica.size();i++){
  51. cout<<endl<<tablica[i].kto<<" "<<i<<" Wprowadzil wartosc = "<<tablica[i].liczba<<". (x,y) ="<<tablica[i].x<<","<<tablica[i].y;
  52. }
  53.  
  54. }
  55.  
  56. void Show(int **Kwadrat,int n){
  57. cout<<endl;
  58. for (int i = 0; i < n; i++) {
  59. for (int j = 0; j < n; j++)
  60. printf("%3d ",Kwadrat[i][j]);
  61.  
  62. cout<<endl;
  63. }
  64. }
  65.  
  66. void Wprowadz_Wynik(int **kwadrat){
  67. std::unique_lock<std::mutex> lck(mtx);
  68. while(!koniec){
  69. while (!ready) cv.wait(lck);
  70. kwadrat[tablica[Number].x][tablica[Number].y]=tablica[Number].liczba;
  71. Number++;
  72. ready=false;
  73. cv.notify_one();
  74. }
  75. }
  76.  
  77. void Wygas(int **Kwadrat,int n){
  78. int x,y;
  79.  
  80. do{
  81. x=rand()%n;
  82. y=rand()%n;
  83. } while((Kwadrat[x][y]==-1)||(!x));
  84.  
  85. Kwadrat[x][y]=-1;
  86. }
  87.  
  88. bool Sprawdz(int **Kwadrat,int n){
  89.  
  90. for (int i = 0; i < n; i++) {
  91. for (int j = 0; j < n; j++){
  92. if(Kwadrat[i][j]==-1)
  93. return false;
  94. }
  95. }
  96.  
  97. return true;
  98. }
  99.  
  100. void Rozwiaz_Wierszami(int **Kwadrat,int n){
  101. int sumtemp=0;
  102. int x,y,flaga=0,liczba=0;
  103.  
  104. Value temp;
  105.  
  106. string Watek_W="Watek_W";
  107.  
  108. while(!Sprawdz(Kwadrat,n)){
  109. // this_thread::sleep_for (std::chrono::seconds(1));
  110. for(int i=0;i<n;i++){
  111. for(int j=0;j<n;j++){
  112. if((Kwadrat[i][j]==-1)&&(flaga==0)){
  113. if(suma==-1){
  114. flaga=1;
  115. break;
  116. }
  117. x=i;
  118. y=j;
  119. flaga=1;
  120. }
  121. else if((Kwadrat[i][j]==-1)&&(flaga)){
  122. flaga = 0;
  123. break;
  124. }
  125. else
  126. sumtemp+=Kwadrat[i][j];
  127.  
  128.  
  129. }
  130. if((!flaga)&&(suma==-1)){
  131.  
  132. Wpisz_Rozwiazanie(sumtemp,Watek_W);
  133. }
  134. if(flaga){
  135. std::unique_lock<std::mutex> lck(mtx);
  136. temp.kto=Watek_W , temp.x=x , temp.y=y, temp.liczba=suma-sumtemp;
  137. tablica.push_back(temp);
  138. ready = true;
  139. cv.notify_one();
  140. while (ready) cv.wait(lck);
  141. flaga=0;
  142. }
  143. sumtemp=0;
  144. }
  145. liczba++;
  146. Sleep(10);
  147. if(liczba==100) return;
  148. }
  149. }
  150.  
  151. void Rozwiaz_Kolumnami(int **Kwadrat,int n){
  152. int sumtemp=0;
  153. int x,y,flaga=0,liczba=0;
  154.  
  155. string Watek_K="Watek_K";
  156.  
  157. Value temp;
  158.  
  159. while(!Sprawdz(Kwadrat,n)){
  160. // this_thread::sleep_for (std::chrono::seconds(1));
  161. for(int i=0;i<n;i++){
  162. for(int j=0;j<n;j++){
  163. if((Kwadrat[j][i]==-1)&&(flaga==0)){
  164. if(suma==-1){
  165. flaga=1;
  166. break;
  167. }
  168. x=j;
  169. y=i;
  170. flaga=1;
  171. }
  172. else if((Kwadrat[j][i]==-1)&&(flaga)){
  173. flaga = 0;
  174. break;
  175. }
  176. else
  177. sumtemp+=Kwadrat[j][i];
  178.  
  179.  
  180. }
  181. if((!flaga)&&(suma==-1)){
  182.  
  183. Wpisz_Rozwiazanie(sumtemp,Watek_K);
  184. }
  185. if((flaga)&&(suma!=-1)){
  186. std::unique_lock<std::mutex> lck(mtx);
  187. temp.kto=Watek_K , temp.x=x , temp.y=y, temp.liczba=suma-sumtemp;
  188. tablica.push_back(temp);
  189. ready = true;
  190. cv.notify_one();
  191. while (ready) cv.wait(lck);
  192. flaga=0;
  193. }
  194. sumtemp=0;
  195. flaga=0;
  196. }
  197. liczba++;
  198. Sleep(10);
  199. if(liczba==100) return;
  200. }
  201. }
  202.  
  203. void Rozwiaz_Przekatna(int **Kwadrat,int n){
  204.  
  205. int sumtemp=0;
  206. int x,y,flaga=0,liczba=0;
  207. int j=0;
  208.  
  209. string Watek_P="Watek_P";
  210.  
  211. Value temp;
  212.  
  213. while(!Sprawdz(Kwadrat,n)){
  214. //this_thread::sleep_for (std::chrono::seconds(1));
  215. for(int i=n-1;i>=0;i--){
  216. if((Kwadrat[i][j]==-1)&&(flaga==0)){
  217. if(suma==-1){
  218. flaga=1;
  219. break;
  220. }
  221. else{
  222. x=i;
  223. y=j;
  224. flaga=1;
  225. }
  226. }
  227. else if((Kwadrat[i][j]==-1)&&(flaga)){
  228. flaga = 0;
  229. break;
  230. }
  231. else
  232. sumtemp+=Kwadrat[i][j];
  233. j++;
  234.  
  235.  
  236. }
  237. if((!flaga)&&(suma==-1)){
  238.  
  239. Wpisz_Rozwiazanie(sumtemp,Watek_P);
  240. }
  241. if((flaga)&&(suma!=-1)){
  242. std::unique_lock<std::mutex> lck(mtx);
  243. temp.kto=Watek_P , temp.x=x , temp.y=y, temp.liczba=suma-sumtemp;
  244. tablica.push_back(temp);
  245. ready = true;
  246. cv.notify_one();
  247. while (ready) cv.wait(lck);
  248. flaga=0;
  249. }
  250. sumtemp=0;
  251.  
  252.  
  253. j=0;
  254. flaga=0;
  255. for(int i=0;i<n;i++){
  256. if((Kwadrat[i][j]==-1)&&(flaga==0)){
  257. if(suma==-1){
  258. flaga=1;
  259. break;
  260. }
  261. x=i;
  262. y=j;
  263. flaga=1;
  264. }
  265. else if((Kwadrat[i][j]==-1)&&(flaga)){
  266. flaga = 0;
  267. break;
  268. }
  269. else
  270. sumtemp+=Kwadrat[i][j];
  271. j++;
  272.  
  273.  
  274. }
  275. if((!flaga)&&(suma==-1)){
  276.  
  277. Wpisz_Rozwiazanie(sumtemp,Watek_P);
  278. }
  279. if((flaga)&&(suma!=-1)){
  280. std::unique_lock<std::mutex> lck(mtx);
  281. temp.kto=Watek_P , temp.x=x , temp.y=y, temp.liczba=suma-sumtemp;
  282. tablica.push_back(temp);
  283. ready = true;
  284. cv.notify_one();
  285. while (ready) cv.wait(lck);
  286. flaga=0;
  287. }
  288. sumtemp=0;
  289. flaga=0;
  290. j=0;
  291. liczba++;
  292. Sleep(10);
  293. if(liczba==100) return;
  294. }
  295. }
  296.  
  297.  
  298. int main()
  299. {
  300. srand(time(NULL));
  301. int i,j,n,liczba,rozwiazanie;
  302. int **Kwadrat;
  303.  
  304. do{
  305. system("cls");
  306. cout<<"Wprowadz n ";
  307. cin>>n;
  308. }while(n%2==0);
  309.  
  310. Kwadrat = new int*[n];
  311. for (i = 0; i < n; i++) {
  312. Kwadrat[i] = new int[n];
  313. for (j = 0; j < n; j++){
  314. Kwadrat[i][j] = f(n, n - j - 1, i)*n + f(n, j, i) + 1;
  315. }
  316. }
  317.  
  318. /*semafory = new mutex*[n];
  319. for (i = 0; i < n; i++) {
  320. semafory[i] = new mutex[n];
  321. }
  322. */
  323. Show(Kwadrat,n);
  324. cout<<"Ile kwadratow wygasic?";
  325. cin>>liczba;
  326.  
  327.  
  328.  
  329. for(i=0;i<liczba;i++)
  330. Wygas(Kwadrat,n);
  331.  
  332. Show(Kwadrat,n);
  333.  
  334. cout<<"Start?";
  335. getchar();getchar();
  336.  
  337.  
  338.  
  339. thread Semafor (Wprowadz_Wynik,Kwadrat);
  340. thread kolumna (Rozwiaz_Kolumnami,Kwadrat,n);
  341. thread wiersz (Rozwiaz_Wierszami,Kwadrat,n);
  342. thread przekatna (Rozwiaz_Przekatna,Kwadrat,n);
  343.  
  344.  
  345. //cout<<endl<<kolumna.get_id();
  346. wiersz.join();
  347. kolumna.join();
  348. przekatna.join();
  349.  
  350. logi();
  351. //Show(Kwadrat,n);
  352. if(Sprawdz(Kwadrat,n)){
  353. cout<<endl;
  354. Show(Kwadrat,n);
  355. }
  356. else{
  357. cout<<endl<<"\nNie da sie rozwiazac";
  358. Show(Kwadrat,n);
  359. }
  360.  
  361.  
  362.  
  363. return 0;
  364. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement