Frage

Ich bin ein kleines Pilotprojekt zu schreiben, und ich muß passieren und Objekt vom Typ QueuList von Wert zu einem Thread-Pool-Thread. Es ist ein Boost-Threadpool und ich bin mit Bind den args auf den Faden zu übergeben.

Aus irgendeinem Grund kann ich nicht scheinen, um meine Artikel in den Threadpool-Thread von Wert ...

passieren

Kann jemand helfen, was ich falsch mache?

void ConsumerScheduler()
{
    int count = 0;
    typedef boost::intrusive::list<QueuList> List;
    while (true)
    {
        WaitForSingleObject(hConsumer, 2000); // Wait for hConsomuer to become > 0
        {
            //lock Queue
            QueuList *item = NULL;
            boost::mutex::scoped_lock lock(mtx);
            {//Scope of lock
                if (lst->size() == 0)
                {
                    printf("List is emtpy"); 
                    continue;
                }
                else
                {
                    List::iterator iter(lst->begin());
                    item = &*iter;
                    lst->pop_front();  //Item is removed from list, so pointer is no longer available!!!
                    printf("Popped item off list.  List current size: %d\n",lst->size());
                    count++;
                }
            }
            //Pass to threadpool
            tpp.schedule(boost::bind(taskfunc,*item)); //it will not accept *item or item in this bind function to pass it by value
            total--;
            if (total == 0)
            {
                printf("Total is now zero!\nCount is %d\n", count);
            }
            if (count == 5)
                break;

            ReleaseSemaphore(hProducer,total , NULL);  // Release the hProducer semaphore, possibly waking producer
        }
    }
}

//Thread pool thread function
void taskfunc(QueuList list)
{
    boost::mutex::scoped_lock lock(mtx);
    {
        std::string name= list.GetName();
        printf("Name gotten: %s",name);
    }

}

Der Grund, warum ich nach Wert zu übergeben will, ist so jeder Threadpool-Thread seiner eigene Kopie des Objekts hat als der Zeiger aus der Liste durch die erste Funktion entfernt wird, wird dies einen Fehler verursachen, wenn ich als Verweis übergeben.

War es hilfreich?

Lösung

Sie können dieses Problem lösen, indem boost::shared_ptr<QueueList> in der Warteschlange und die Threadplanung verwenden. Die besten drückt die Hand aus den gemeinsam genutzten Daten, die Sie mögen, in Abwesenheit von unique_ptr in einigen STLs.

Andere Tipps

Der Fehler tritt zur Laufzeit oder die Kompilierung?

Ich schaffe meinen eigenen Code und keine Kompilation erros haben.

Ich benutze Boost nicht, aber, wenn Sie eine Fehlermeldung anzeigt auf Laufzeit, ich glaube, der Fehler in scoped Sperre. Die scoped Schloss soll nicht in den Klammern sein?

EDIT: Ich habe keine Privilegien Kommentar, so dass ich als Antwort geschrieben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top