スレッドを使用して複数の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
を必要としますが、反復子は定義上のポインタなので、十分に参照を外していますか?明示的なキャストはソリューションの一部ですか?私はこれまでに試したことはありませんでした。
C++ 11の組み込みスレッドサポートを使用できない特定の理由はありますか?一般的にボイラープレートとキャスティングのかなりの部分を回避します。 –
はい:これはC++ 11スレッドの使用を禁止する学校プロジェクト用です。外見上、私たちは、そのサポートによって提供される便利な抽象レイヤーのためにプロセスが実際にどのように機能するかを忘れることはありません。 私は間違いなくC++ 11スレッドにいくつかの良いガイドをブックマークしています。彼らはかなり使いやすくなっています。 – user3776749