geben Objekt durch einen Wert zu einem anderen Thread
-
27-09-2019 - |
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 ...
passierenKann 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.
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