Problema thread lettura/scrittura su seriale

di il
3 risposte

Problema thread lettura/scrittura su seriale

Salve ragazzi come da titolo ho un problema a gestire la lettura e la scrittura su seriale.
Per come ho strutturato il programma ho:
- un main in loop che che legge i messaggi su seriale e li scrive su un buffer,
- un thread che prende il buffer, pulisce la stringa(se sporca) e la carica su una coda,
- un thread che prende l'elemento dalla coda(se non è vuota) e lo scrive su un database.
Da notare che ho utilizzato sia la libreria mutex che quella per i thread.
Se il thread pop è commentato, il programma carica correttamente gli elementi nella coda, invece se tolgo il commento il programma va in loop e non legge neanche più da seriale.
Posto in breve la parte del programma in questione:

queue q;
while(1)
        {
         char buf [300]={0};
        int n = read (fd, buf, sizeof buf); 
        if(n >0)
        {
        printf("Il buffer contiene la stringa: %s \n",buf);
	  }
        /*thread  Push*/
        std::thread push(std::bind(pushString, std::ref(q),buf));

        /*thread Pop */
        std::thread pop(std::bind(&popString, std::ref(q), 1));

        push.join();
        pop.join();
        }
Spero qualcuno possa aiutarmi. Grazie in anticipo ^_^

3 Risposte

  • Re: Problema thread lettura/scrittura su seriale

    Posta il codice delle funzioni che operano su q. Comunque mi sembra normale che va in loop, hai messo while(1) e non hai un controllo per decidere quando interrompere il loop. Poi non c'è bisogno di mettere & quando fai il bind per il secondo thread !
  • Re: Problema thread lettura/scrittura su seriale

    Grazie per la pronta risposta. Il loop sul while è voluto cosi rimanere sempre in ascolto sulla seriale. Il loop che dicevo io è perchè non riesce ad uscire dal thread pop, quindi si blocca tutto il programma.
    Di seguito posto il codice per la queue:
    
    #include <queue>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    
    template <typename T>
    class Queue
    {
     public:
    T pop()
      {
        std::unique_lock<std::mutex> mlock(mutex_);
        if (queue_.empty())
        {
          cond_.wait(mlock);
        }
        else
        {
            auto item = queue_.front();
            queue_.pop();
            return item;
        }
    
      }
    
      void pop(T& item)
      {
        std::unique_lock<std::mutex> mlock(mutex_);
        if (queue_.empty())
        {
          cond_.wait(mlock);
        }
        else
        {
        item = queue_.front();
        queue_.pop();
        }
      }
    
      void push(const T& item)
      {
        std::unique_lock<std::mutex> mlock(mutex_);
        queue_.push(item);
        mlock.unlock();
        cond_.notify_one();
      }
    
      void push(T&& item)
      {
        std::unique_lock<std::mutex> mlock(mutex_);
        queue_.push(std::move(item));
        mlock.unlock();
        cond_.notify_one();
      }
    
     private:
      std::queue<T> queue_;
      std::mutex mutex_;
      std::condition_variable cond_;
    };
    
    Ho fatto diverse prove e ho notato che se sposto entrambi i thread nel blocco "if(n>0)" funziona tutto perferttamente . Un'altra domanda che mi sto facendo è i thread sono sempre due opppure vengono lanciati n thread? Scusate sono poco competente riguardo seriali e thread.
  • Re: Problema thread lettura/scrittura su seriale

    Risolto potete chiudere =)
Devi accedere o registrarti per scrivere nel forum
3 risposte