Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.03 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <thread>
  4. #include <ctime>
  5. #include <cstdlib>
  6. #include <mutex>
  7. #include <atomic>
  8. #include <iomanip>
  9. #include <fstream>
  10.  
  11. using namespace std;
  12.  
  13. /*
  14. Zad.1 - Zegar
  15. Stwórz klasę zawierającą zmienną typu time_t oraz operator(),
  16. w którym zostanie umieszona nieskończona pętla przedstawiająca czas w konsoli.
  17. Następnie stwórz wątek z tą klasą jako parametrem.
  18. */
  19.  
  20.  
  21. class T
  22. {
  23.     time_t czas;
  24. public:
  25.     void operator()()
  26.     {
  27.         time(&czas);
  28.         while (1)
  29.         {
  30.             cout << ctime(&czas);
  31.             this_thread::sleep_for(chrono::milliseconds(100));
  32.             time(&czas);
  33.             system("cls");
  34.         }
  35.     }
  36. };
  37.  
  38.  
  39. /*
  40. Zad.2 - ID watku na przemian
  41. Stwórz funkcje z parametrem n tworzącą dwa wątki. Dany wątek ma wypisywać własne id.
  42. Oba wątki mają być wykonywane naprzemiennie z wykorzystaniem globalnej zmiennej typu bool.
  43. */
  44.  
  45. bool _switch = true;
  46. void thread1(int n)
  47. {
  48.     thread::id this_id = this_thread::get_id();
  49.     for (int i = 0; i < n; i++)
  50.     {
  51.         while (!_switch)
  52.             this_thread::yield();
  53.         cout << "something... by " << this_id << " thread" << endl;
  54.         _switch = false;
  55.     }
  56. }
  57. void thread2(int n)
  58. {
  59.     thread::id this_id = this_thread::get_id();
  60.     for (int i = 0; i < n; i++)
  61.     {
  62.         while (_switch)
  63.             this_thread::yield();
  64.         cout << "something... by " << this_id << " thread" << endl;
  65.         _switch = true;
  66.     }
  67. }
  68. void sync(const int n)
  69. {
  70.     thread t1(thread1, n);
  71.     thread t2(thread2, n);
  72.     t1.join();
  73.     t2.join();
  74. }
  75.  
  76. /*
  77. Zad. 3 - Dostep do pliku z uzyciem mutexu
  78. Utworz dwie funkcje dzialajace na dwoch osobnych watkach, ktore na przemian wpisuja do tego samwgo pliku ciag liczb od 0 do 10.
  79. Do synchronizacji wykorzystaj zmienna typu mutex oraz funkcje this_thread::sleep_for(chrono::milliseconds()).
  80. */
  81.  
  82. mutex mtx;
  83. fstream file;
  84. void foo_one()
  85. {
  86.     for (int i = 0; i < 10; i++)
  87.     {
  88.         mtx.lock();
  89.         file.open("data.txt", ios::app | ios::in);
  90.         if (file.is_open())
  91.         {
  92.             file << "foo_one: " << i << endl;
  93.         }
  94.         file.close();
  95.         mtx.unlock();
  96.         this_thread::sleep_for(chrono::milliseconds(250));
  97.     }
  98. }
  99.  
  100. void foo_two()
  101. {
  102.     for (int i = 0; i < 10; i++)
  103.     {
  104.         mtx.lock();
  105.         file.open("data.txt", ios::app | ios::in);
  106.         if (file.is_open())
  107.         {
  108.             file << "foo_two: " << i << endl;
  109.         }
  110.         file.close();
  111.         mtx.unlock();
  112.         this_thread::sleep_for(std::chrono::milliseconds(250));
  113.     }
  114. }
  115.  
  116. /*
  117. Zad. 4 - "Przeciaganie liny" miedzy watkami
  118. Zadeklaruj globalna zmienna int X, zainicjalizuj ja wartoscia 50. Zadeklaruj globalna zmienna atomowa typu int, zainicjuj ja 0.
  119. Utworz dwie funkcje, ktore dzialaja na dwoch roznych watkach. Maja one dodawac lub odejmowac (na zmiane!) od X
  120. losowa liczbe z przedzialu <1,10> - tak dlugo, jak wartosc X znajduje sie w przedziale (0,100).
  121. Dodawana lub odejmowana liczba powinna byc zmienna atomowa, ktorej aktualna wartosc jest losowana w kazdym z watkow za pomoca funkcji rand().
  122. */
  123.  
  124.  
  125. int X = 50;
  126. atomic<int> random = 0;
  127. bool flag = true;
  128.  
  129. void dodawaj()
  130. {
  131.     thread::id this_id = this_thread::get_id();
  132.     while (X > 0 && X < 100)
  133.     {
  134.         random = (1 + (rand() % 10));
  135.         if (flag == true)
  136.         {
  137.             this_thread::sleep_for(std::chrono::milliseconds(100));
  138.             X += random;
  139.             cout << "Thread #" << this_id << "\tpoints: " << X << endl;
  140.             flag = false;
  141.         }
  142.         else
  143.             this_thread::yield();
  144.     }
  145.  
  146. }
  147.  
  148. void odejmuj()
  149. {
  150.     thread::id this_id = this_thread::get_id();
  151.     while (X > 0 && X < 100)
  152.     {
  153.         random = (1 + (rand() % 10));
  154.         if (flag == false)
  155.         {
  156.             this_thread::sleep_for(std::chrono::milliseconds(100));
  157.             X -= random;
  158.             cout << "Thread #" << this_id << "\tpoints: " << X << endl;
  159.             flag = true;
  160.         }
  161.         else
  162.             this_thread::yield();
  163.     }
  164. }
  165.  
  166. int main()
  167. {
  168.     /// zadanie 1
  169.     //T clock;
  170.  
  171.     //thread t(clock);
  172.     //t.join();
  173.  
  174.     /// zadanie 2
  175.     //sync(5);
  176.  
  177.     /// zadanie 3
  178.     //thread thread_1(foo_one);
  179.     //thread thread_2(foo_two);
  180.     //thread_1.join();
  181.     //thread_2.join();
  182.  
  183.     /// zadanie 4
  184.     //srand(time(NULL));
  185.  
  186.     //thread t41(dodawaj);
  187.     //thread t42(odejmuj);
  188.     //t41.join();
  189.     //t42.join();
  190.  
  191.     system("pause");
  192.     return 0;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement