[C++] Problema con le thread

di il
11 risposte

[C++] Problema con le thread

Ciao a tutti ho da poco iniziato a fare esercizi sulle thread ed ovviamente ho i primi problemi
Devo svolgere questo semplice esercizio dove ho un buffer, in cui devo inserire dei dati presi da un file input_file.txt, ad esempio questo:
1
2
3
4
Questi dati poi vengono letti e inseriti nel buffer con la funzione lettura_posizione e poi vengono letti e scritti a terminale con la funzione scrittura_posizione, il tutto gestendo l'accesso al buffer.
Questo è il buffer:
// Buffer.h

#ifndef Buffer_h
#define Buffer_h

#include <queue>
using std::queue;
#include <mutex>
using std::mutex;
#include <condition_variable>
using std::condition_variable;

class Buffer
{
    public:
        void append(double v);
        double take();

    private:
        queue<double> buffer_;
        mutex mutex_;
        condition_variable not_empty_;       
};

void lettura_posizione(Buffer buf);
void model(Buffer buf);

#endif
//Buffer.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <fstream>
using std::ifstream;
#include <string>
using std::string;
#include <mutex>
using std::mutex;
using std::unique_lock;
#include <condition_variable>
using std::condition_variable;

#include "Buffer.h"

void Buffer::append(double shift)
{
    unique_lock<mutex> mlock(mutex_);
    buffer_.push(shift);
    not_empty_.notify_one(); //signalC
}

double Buffer::take()
{
    unique_lock<mutex> mlock(mutex_);
    while(buffer_.empty())
        not_empty_.wait(mlock); //waitC
    double posit =buffer_.front();
    buffer_.pop();
    return posit;
}

void lettura_posizione(Buffer buf)
{
    //Prendo i dati di input da un file txt
    ifstream input("input_file.txt");
        if(!input.is_open())
    {
        cout << "Unable to open the input file." << endl;
        exit(EXIT_FAILURE);
    }
	string line;
	while (getline (input, line)){
        size_t pos = line.find_first_of(" ",0);
        double position = stod(line.substr(pos+1,line.size()));
        buf.append(position);
    }
}

void scrittura_posizione(Buffer buf)
{
    for(int i=0; i<4; i++){
            double pos= buf.take();
            cout<<pos<<endl;
    }
}
E il main è questo:
#include <iostream>
using std::cout;
using std::endl;
#include <thread>
using std::thread;


#include "Buffer.h"

Buffer b1;

int main(int argc, char* argv[])
{
    thread lettura{lettura_posizione, b1};
    thread scrittura{scrittura_posizione, b1};

    lettura.join();
    scrittura.join();
    
    cout << "End of main thread." << endl;

    return 0;
}
Il problema è che quando compilo mi esce questo errore:
In file included from main.cpp:4:
/usr/include/c++/9/thread: In instantiation of ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(Buffer); _Args = {Buffer&}; <template-parameter-1-3> = void]’:
main.cpp:47:41:   required from here
/usr/include/c++/9/thread:120:44: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues
  120 |           typename decay<_Args>::type...>::value,
      |                                            ^~~~~
/usr/include/c++/9/thread: In instantiation of ‘struct std::thread::_Invoker<std::tuple<void (*)(Buffer), Buffer> >’:
/usr/include/c++/9/thread:131:22:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(Buffer); _Args = {Buffer&}; <template-parameter-1-3> = void]’
main.cpp:47:41:   required from here
/usr/include/c++/9/thread:243:4: error: no type named ‘type’ in ‘struct std::thread::_Invoker<std::tuple<void (*)(Buffer), Buffer> >::__result<std::tuple<void (*)(Buffer), Buffer> >’
  243 |    _M_invoke(_Index_tuple<_Ind...>)
      |    ^~~~~~~~~
/usr/include/c++/9/thread:247:2: error: no type named ‘type’ in ‘struct std::thread::_Invoker<std::tuple<void (*)(Buffer), Buffer> >::__result<std::tuple<void (*)(Buffer), Buffer> >’
  247 |  operator()()
      |  ^~~~~~~~
Qualcuno sa dove sbaglio e può aiutarmi? Grazie

11 Risposte

  • Re: [C++] Problema con le thread

    E da quando i thread sono diventati le thread?

    P.S. non scrivere in rosso...
  • Re: [C++] Problema con le thread

    Il mio professore le chiama "le thread" , ricevuto per il rosso (era per specificare bene l'errore)!
    In ogni caso sapresti aiutarmi? Penso che il problema sia il passare una classe come parametro delle funzioni, ma non so come risolvere
  • Re: [C++] Problema con le thread

    Il fatto è che non leggo bene il rosso sul banco sul telefono... prima di dirti qualcosa

    P.S. il tuo professore è strano
  • Re: [C++] Problema con le thread

    Ecco ho modificato il messaggio
  • Re: [C++] Problema con le thread

    Il costruttore di thread non vuole argomenti passati direttamente per riferimento, ma vanno prima incapsulati in un reference_wrapper.

    Guarda come ha creato t3 in questo esempio:
    https://en.cppreference.com/w/cpp/thread/thread/threa
  • Re: [C++] Problema con le thread

    Grazie era quello il problema! Inoltre mi ero scordato di fare il pass by reference della classe Buffer in queste due funzioni:
    void lettura_posizione(Buffer &buf);
    void model(Buffer &buf);
    Sia nel file .h che nel file .cpp
  • Re: [C++] Problema con le thread

    Non si passano classi ma oggetti
  • Re: [C++] Problema con le thread

    Ma aiuti anche a risolvere i problemi o correggi solo i termini sbagliati? L'unico che mi ha aiutato qui è stato Alexv (che ringrazio), che con un messaggio di tre righe mi ha risolto il problema
  • Re: [C++] Problema con le thread

    Correggere termini sbagliati è aiutare. Forse non lo capisci.
    Qui non c'è la gara a chi aiuta, chi ha tempo risponde quando può. Nessuno è al tuo servizio.
  • Re: [C++] Problema con le thread

    Non ho detto che sia sbagliato correggere i termini, ma c'è modo e modo.
    Affermazioni come questa, ad esempio, non sono di nessun aiuto "E da quando i thread sono diventati le thread?"
  • Re: [C++] Problema con le thread

    Questa è solo una tua impressione. Ti saranno d'aiuto quando parlerai con altri programmatori di thread.

    La tua polemica è fuori luogo.
Devi accedere o registrarti per scrivere nel forum
11 risposte