Arbeiten an einem einfachen Projekt, mehrere TXT-Dateien mit Threads zu tally. Der einzige Fehler, der bei der Kompilierung auftritt, ist die vector<pthread_t>::iterator
, die in der pthread_join
-Schleife verwendet wird.Erstellen und verbinden Pthreads mit Vektor <pthread_t> :: Iterator
Der Fehler ist:
error: invalid conversion from long unsigned int* to pthread_t {aka long unsigned int} [-permissive]} `pthread_join(&*iter, (void**)&returnValue);` <--
Hier ist der relevante Code:
vector<string> voteTallyFiles;
vector<voteTally> intermVoteTallies;
tallyArgs *pThreadArgs;
void *returnValue;
int index = 0;
getFileNames(VOTE_TALLY_DPATH, voteTallyFiles);
vector<pthread_t> threads(voteTallyFiles.size());
for (vector<pthread_t>::iterator iter = threads.begin(); iter != threads.end(); ++iter, index++)
{
pThreadArgs->fName = voteTallyFiles[index];
pthread_create(&*iter, NULL, countVotes, pThreadArgs);
}
for (vector<pthread_t>::iterator iter = threads.begin(); iter != threads.end(); ++iter)
{
pthread_join(&*iter, (void**)&returnValue);
intermVoteTallies.push_back((voteTally)returnValue)
}
Ich habe durch die Dokumentation für pthread lesen und pthread_join gesagt, und glaube, ich habe Ich habe alle Hinweise/Referenzen korrekt gelesen, aber offensichtlich habe ich irgendwo etwas übersehen.
Ich habe versucht:
pthread_join(iter, (void**)&returnValue);
und
pthread_join(&iter, (void**)&returnValue);
aber ähnliche Fehler erhalten:
error: cannot convert std::vector<long unsigned int>::iterator {aka __gnu_c} long unsigned int*, std::vector<long unsigned int>} to pthread_t {aka long unsigned int} pthread_join(iter, (void**)&returnValue); <--
und
error: invalid conversion from std::vector<long unsigned int>::iterator* {aka __gnu_cxx::__normal_iterator<long unsigned int*, std::vector<long unsigned int> >*} to pthread_t {aka long unsigned int} [-fpermissive]} pthread_join(&iter, (void**)&returnValue); <--
In beiden Fällen ist es offensichtlich ist, dass ich versuche, einen Zeiger auf nicht-Zeiger Umwandlung zu tun. pthread_join
will einen non-pointerthread_t
aber ein Iterator ist per Definition ein Zeiger, also ist die De-Referenzierung nicht genug? Ist expliziter Casting Teil der Lösung? Nichts, was ich bisher versucht habe, hat funktioniert.
Gibt es einen bestimmten Grund, warum Sie die integrierte C++ 11-Threading-Unterstützung nicht verwenden können? Es vermeidet im Allgemeinen viel von der Kesselplatte und dem Guss, wie Sie es gerade haben. –
Ja: Dies ist für ein Schulprojekt, das die Verwendung von C++ 11 Threads verbietet. Scheinbar versäumen wir es nicht zu lernen, wie der Prozess tatsächlich funktioniert, aufgrund der Schichten der bequemen Abstraktion, die durch diese Unterstützung bereitgestellt werden. Ich habe definitiv ein paar gute Guides zu C++ 11 Threads vorgemerkt, da sie viel brauchbarer scheinen – user3776749