Guest User

Untitled

a guest
Dec 19th, 2020
350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <cmath>
  5. #include <thread>
  6. #include <fstream>
  7. #include <mutex>
  8. #include <cstdlib>
  9. #include <ctime>
  10.  
  11. std::mutex g_lock;
  12.  
  13. using namespace std;
  14.  
  15. struct Message {
  16.     vector<double> values;
  17.     int address = -99;
  18. };
  19.  
  20. class MailBox {
  21.     vector<Message>* messages = new vector<Message>();
  22. public:
  23.     void messageSend(string msg){
  24.         cout << msg;
  25.     }
  26.     void sendMessage(Message msg) {
  27.         this_thread::sleep_for(100ms); // DELAY
  28.         messages->push_back(msg);
  29.     }
  30.  
  31.     Message receiveMessage(int address) {
  32.         Message msg;
  33.         int index = -99;
  34.         if (messages->empty()) {
  35.          
  36.             cout << "message box is empty !\n";
  37.             return Message();
  38.         }
  39.         for (int i = 0; i <= messages->size()-1; i++){
  40.             if ((messages->at(i)).address == address) {
  41.                 msg = messages->at(i);
  42.                 index = i;
  43.             }
  44.         }
  45.        
  46.         if (index == -99) {
  47.             return Message();
  48.         }
  49.         messages->erase(messages->begin() + index);
  50.         return msg;
  51.     }
  52. };
  53. MailBox* mailBox = new MailBox();
  54.  
  55.  
  56. void thread_1(){
  57.    
  58.     Message msg2 = Message();
  59.     msg2.address = 2;
  60.     vector<double> values2 = vector<double>();
  61.  
  62.     for (int i = 0; i < 10; ++i) {
  63.         values2.push_back(cos(i));
  64.     }
  65.     msg2.values = values2;
  66.    
  67.     Message msg3 = Message();
  68.     msg3.address = 3;
  69.     vector<double> values3 = vector<double>();
  70.     for (int i = 0; i < 20; i+=2) {
  71.         values3.push_back(cos(i));
  72.     }
  73.     msg3.values = values3;
  74.     mailBox->sendMessage(msg2);
  75.     mailBox->sendMessage(msg3);
  76.     mailBox->messageSend("Thread 1 sent messages \n");
  77. }
  78.  
  79. void thread_2(){
  80.     // переписывает информацию полученную из почтового ящика в текстовый файл.
  81.     Message msg = mailBox->receiveMessage(2);
  82.     if (msg.address == -99){
  83.         cout << "message is empty \n"; // сообщение пустое
  84.         return;
  85.     }
  86.     ofstream file;
  87.     file.open("sin.txt", std::ios_base::app);
  88.     for (auto value: msg.values) {
  89.         file << value << "\n";
  90.     }
  91.     file.close();
  92.     this_thread::sleep_for(50ms);
  93.     mailBox->messageSend("Thread 2 received the message \n");
  94. }
  95.  
  96. void thread_3(){
  97.  
  98.     Message msg = mailBox->receiveMessage(3);
  99.     if (msg.address == -99){
  100.         cout << "message is empty \n"; //
  101.         return;
  102.     }
  103.     ofstream file;
  104.     file.open("cos.txt", std::ios_base::app); /
  105.     for (auto value: msg.values) {
  106.         file << value << "\n";
  107.     }
  108.     file.close();
  109.     this_thread::sleep_for(50ms);
  110.     mailBox->messageSend("Thread 3 received the message \n");
  111. }
  112. int main() {
  113.  
  114.     new thread(thread_1);
  115.     new thread(thread_2);
  116.     new thread(thread_2);
  117.     new thread(thread_2);
  118.     new thread(thread_3);
  119.     new thread(thread_2);
  120.     new thread(thread_1);
  121.     new thread(thread_2);
  122.     new thread(thread_3);
  123.     new thread(thread_2);
  124.     new thread(thread_2);
  125.     new thread(thread_2);
  126.     new thread(thread_3);
  127.     this_thread::sleep_for(9s); // waiting all
  128.     return 0;
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment