2016-04-26 8 views
0

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.

+0

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. –

+0

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

Antwort

2

Das erste Argument von pthread_join() ist pthread_t.

Ihr Iterator iter ist vom Typ vector<pthread_t>::iterator. Das bedeutet, dass *iterpthread_t vom Typ seine

So Sie dereferenzieren haben: pthread_join(*iter, (void**)&returnValue);

Hinweis:&*iter ist daher vom Typ pthread_t * und &iter ist vom Typ Zeiger auf ein Iterator.

+1

Perfekt. Aus irgendeinem Grund dachte ich, ich hätte die Liste mit der Problembehebung mit 'pthread_join (& iter, (void **) & returnValue) überschritten;' was offensichtlich falsch ist. Ich hätte das fangen sollen. Vielen Dank. – user3776749

Verwandte Themen