Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2016
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <string>
  4. #include <vector>
  5. #include <fstream>
  6. #include <mutex>
  7. #include <condition_variable>
  8.  
  9. std::fstream file("file.txt", std::ios::out | std::ios::app);
  10.  
  11. /*
  12.  * readers_count >= 0  | multiple threads can read
  13.  * readers_count == -1 | one thread can write
  14.  */
  15. int readers_count = 0;
  16. std::mutex mtx;
  17.  
  18. std::condition_variable can_write;
  19. std::condition_variable can_read;
  20.  
  21. void read(int x)
  22. {
  23.     std::unique_lock<std::mutex> lock(mtx);
  24.  
  25.     while (! readers_count >= 0) can_read.wait(lock);
  26.  
  27.     ++readers_count;
  28.     for (int i = 0; i < x; ++i)
  29.     {
  30.         std::string tmp;
  31.         if (! std::getline(file, tmp))
  32.             break;
  33.        
  34.         std::cout << "read 1 line from file" << std::endl;
  35.     }
  36.  
  37.     if (--readers_count == 0)
  38.     {
  39.         can_write.notify_one();
  40.     }
  41. }
  42.  
  43. void write(int x)
  44. {
  45.     std::unique_lock<std::mutex> lock(mtx);
  46.    
  47.     while (! readers_count == 0) can_write.wait(lock);
  48.  
  49.     readers_count = -1;
  50.    
  51.     for (int i = 0; i < x; ++i)
  52.     {
  53.         std::cout << "wrote 1 line to file" << std::endl;
  54.         file << std::this_thread::get_id() << " some data" << std::endl;
  55.     }
  56.  
  57.     readers_count = 0;
  58.     lock.unlock();
  59.    
  60.     can_read.notify_one();
  61.     can_write.notify_one();
  62. }
  63.  
  64. int main()
  65. {
  66.     std::vector<std::thread> readers;
  67.     std::vector<std::thread> writers;
  68.  
  69.     for (int i = 0; i < 5; ++i)
  70.     {
  71.         readers.push_back(std::thread(read, 3));    
  72.         writers.push_back(std::thread(write, 3));
  73.     }
  74.  
  75.     for (auto& t : readers) t.join();
  76.     for (auto& t : writers) t.join();
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement