Scoped_lock

di il
10 risposte

Scoped_lock

Buongiorno,

qualcuno sa darmi un'indicazione sul perché possa avvenire un segmentation fault al momento in cui viene passato un mutex a uno scoped_lock? La classe è una semplice coda, il cui codice è:


template<typename T>
class Queue
{
private:
    std::queue<T> the_queue;
    mutable boost::mutex the_mutex;
public:
    Queue() {}

    void push(const T& data)
    {
        boost::mutex::scoped_lock lock(the_mutex);
        the_queue.push(data);
    }

    bool empty() const
    {
        boost::mutex::scoped_lock lock(the_mutex);
        return the_queue.empty();
    }

    T& front()
    {
        boost::mutex::scoped_lock lock(the_mutex);
        return the_queue.front();
    }
    
    T const& front() const
    {
        boost::mutex::scoped_lock lock(the_mutex);
        return the_queue.front();
    }

    void pop()
    {
        boost::mutex::scoped_lock lock(the_mutex);
        the_queue.pop();
    }
};

Quando chiamo la funzione push avviene un segmentation fault, anche se la chiamo commentando l'istruzione the_queue.push(data); (lo sforamento di memoria avviene dunque nel costruttore della scoped_lock).

Grazie

10 Risposte

  • Re: Scoped_lock

    Probabilmente la causa è da un'altra parte e avviene li per caso, dato che il costruttore di scoped_lock non fa altro che invocare la mutex.lock() (o funzione analoga).
  • Re: Scoped_lock

    shodan ha scritto:


    Probabilmente la causa è da un'altra parte e avviene li per caso, dato che il costruttore di scoped_lock non fa altro che invocare la mutex.lock() (o funzione analoga).
    Sì, però se chiamo la push() commentando anche l'invocazione della scoped_lock e mettendoci dentro solo una stampa non avviene il segmentation fault. Infatti non riesco proprio a capire cosa possa essere!
  • Re: Scoped_lock

    A ogni modo il codice che hai postato è corretto.
    Controlla bene quello che fai prima.
  • Re: Scoped_lock

    shodan ha scritto:


    A ogni modo il codice che hai postato è corretto.
    Controlla bene quello che fai prima.
    Infatti pongo la domanda per avere un suggerimento su cosa controllare, quale potrebbe essere la causa. Non riesco a capire perché possa succedere una cosa del genere... Forse devo in qualche maniera inizializzare il mutex?
  • Re: Scoped_lock

    Puntatori. Quando usati male stanno alla base del 95% dei casini.
    Il mutex non serve che sia inizializzato (la documentazione di boost ne accenna?)
    Altro non si può dire con quello che hai postato.
  • Re: Scoped_lock

    shodan ha scritto:


    Puntatori. Quando usati male stanno alla base del 95% dei casini.
    Il mutex non serve che sia inizializzato (la documentazione di boost ne accenna?)
    Altro non si può dire con quello che hai postato.
    Ok. Ma quali puntatori intervengono in questa situazione? Naturalmente non conoscendo il codice non potrai rispondermi, ma arrivo a chiamare la push() senza problemi (infatti, come dicevo, se metto una cout funziona tutto bene), poi la scoped_lock crasha. Ma la scoped_lock al suo interno usa qualche puntatore definito da me da qualche parte?
  • Re: Scoped_lock

    Non hai capito. Il problema non è causato dal frammento di codice che hai postato, ma da quello che fai prima di usarlo.
    E cosa fai prima lo sai solo tu. Può essere un puntatore nella funzione vattelapesca che usi 30 righe prima, e che solo ora fa capire che qualcosa non va.
  • Re: Scoped_lock

    shodan ha scritto:


    Non hai capito. Il problema non è causato dal frammento di codice che hai postato, ma da quello che fai prima di usarlo.
    E cosa fai prima lo sai solo tu. Può essere un puntatore nella funzione vattelapesca che usi 30 righe prima, e che solo ora fa capire che qualcosa non va.
    Ok, grazie.
  • Re: Scoped_lock

    GDB è tuo amico!
  • Re: Scoped_lock

    cappons ha scritto:


    GDB è tuo amico!
    Ho risolto senza gdb: c'era uno shared_ptr che in effetti era inutile (non servivano più oggetti possessori) e l'ho levato. Non ho capito bene perché ho risolto, ma ho risolto.
Devi accedere o registrarti per scrivere nel forum
10 risposte