2016-04-26 10 views
0

スレッドを使用して複数のtxtファイルを集計する簡単なプロジェクトで作業します。私がコンパイルで得ている唯一のエラーは、ループpthread_joinで使用されているvector<pthread_t>::iteratorです。ここでベクトルを使用したpthreadの作成と結合<pthread_t> :: iterator

error: invalid conversion from long unsigned int* to pthread_t {aka long unsigned int} [-permissive]} 
`pthread_join(&*iter, (void**)&returnValue);` <-- 

は、関連するコードです:

誤差があり、具体的

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) 
} 

私はpthreadのためのドキュメントを読んできた、とpthread_joinを、私はしたと思います正しくすべてのポインタ/参照/尊敬を追跡したが、明らかに私はどこかで何かを逃した。

私が試した:

pthread_join(iter, (void**)&returnValue);

pthread_join(&iter, (void**)&returnValue);

が、同様のエラーを取得:

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); <-- 

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); <-- 

どちらの場合も、それは私が非ポインタの変換へのポインタをやろうとしていることが明らかです。 pthread_joinの非ポインタthread_tを必要としますが、反復子は定義上のポインタなので、十分に参照を外していますか?明示的なキャストはソリューションの一部ですか?私はこれまでに試したことはありませんでした。

+0

C++ 11の組み込みスレッドサポートを使用できない特定の理由はありますか?一般的にボイラープレートとキャスティングのかなりの部分を回避します。 –

+0

はい:これはC++ 11スレッドの使用を禁止する学校プロジェクト用です。外見上、私たちは、そのサポートによって提供される便利な抽象レイヤーのためにプロセスが実際にどのように機能するかを忘れることはありません。 私は間違いなくC++ 11スレッドにいくつかの良いガイドをブックマークしています。彼らはかなり使いやすくなっています。 – user3776749

答えて

2

pthread_join()の第1引数はpthread_tでなければなりません。

イテレータitervector<pthread_t>::iteratorです。これは、あなたがそれを間接参照する必要があります*iterのタイプがpthread_t

になることを意味しますpthread_join(*iter, (void**)&returnValue);

注:&*iterはタイプpthread_t *&iterの故にであるイテレータへのポインタ型です。

+1

Perfect。なんらかの理由で、私はこの問題を 'pthread_join(&iter、(void **)&returnValue); 'で明らかに間違っています。私はそれを捕らえておくべきだった。本当にありがとう。 – user3776749

関連する問題