Boost::mutex und std::vector?



  • Hallo,

    ich versuche im Moment einen vector (v.a. insert) thread-sicher zu bekommen. Allerdings funktioniert es nicht wirklich. (segfault ist keine sehr schöne Programmausgabe :D)
    Hier mal mein Code:

    static mutex mt;
    
    void parallel_function(vector* ret){
        //...
        unsigned int j = ...;
        //...
    
        mt.lock();
        //füge p an stelle j ein
        ret->insert(ret->begin()+j, p); //XXX
        mt.unlock();
    
        //...
    }
    

    Nicht wundern warum's ein pointer auf einen vector ist - geht (hier) nicht anders.
    Der vector ist übrigens zu Beginn leer (sollte bei insert kein Problem darstellen).

    Meine Funktion füllt parallel den vector, endet aber immer in einem Segfault. Ich kann mir aber nicht so recht erklären warum. Der iterator wird jedes mal neu berechnet und race-conditions sollten durch lock nicht mehr möglich sein.
    Wenn ich die mit XXX markierte Zeile auskommentiere, funktioniert alles problemlos. (bis auf den leeren vector)

    Ich wäre dankbar für Hilfestellungen 😉



  • </Exit> schrieb:

    ret->insert(ret->begin()+j, p);
    

    Was ist denn j , wenn ret leer ist? Wenn j > 0 , ist der übergebene Iterator ungültig.



  • EDIT: ui... Allerdings... j... Das wird wohl das Problem sein -> Zeit fürs Bett ^^



  • Oh ja, das stimmt... Hm hm, das wird doch noch komplizierter als gedacht.

    Vielen Dank!



  • Hallo

    Kleine Anregung dazu, weiß nur nicht wieviel es dir hilft da doch etwas viel vom Code fehlt.

    Aber zum einen könntest du du push_back benutzten wenns ans Ende hin muss, was du aber bestimmt selber gefunden hast.

    Oder wenn du einen direkten Zugriff auf Indizes benötigst dann mit Reserve und operator[]

    Mfg marco



  • Nicht reserve sondern resize . reserve reserviert nur den Platz und legt die Elemente nicht an.



  • ipsec schrieb:

    Nicht reserve sondern resize . reserve reserviert nur den Platz und legt die Elemente nicht an.

    Stimmt danke fürs Berichtigen 🙂

    Mfg marco



  • Danke für den Tipp...

    Hab ich mir auch schon überlegt, aber da ich nicht weiß, wie groß das Ding wird, kommt nur noch push_back in Frage und da die Threads jeweils nur ihren Teil des (zu Grunde liegenden) Arrays füllen sollen, geht push_back auch nicht.

    Bin jetzt umgestiegen auf eine LinkedList mit #threads leeren Elementen zu Beginn.
    => jeder Thread bekommt seinen eigenen Iterator und kann dann per insert seine Werte einfügen. (Reihenfolge muss nämlich konstant bleiben)

    Trotzdem dankeschön 😉


Anmelden zum Antworten