使用 vector<pthread_t>::iterator 创建和连接 pthread
Creating and Joining pthreads using vector<pthread_t>::iterator
正在处理一个简单的项目,使用线程统计多个 txt 文件。我在编译中遇到的唯一错误涉及 vector<pthread_t>::iterator
在 pthread_join
循环中使用。
错误是:
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,我认为我已经正确地跟踪了所有 pointers/reference/deference,但显然我在某处遗漏了一些东西。
我试过了:
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
但是迭代器根据定义是一个指针,那么取消引用它还不够吗?显式转换是解决方案的一部分吗?到目前为止,我所做的一切都没有奏效。
pthread_join()
的第一个参数应为 pthread_t。
您的迭代器 iter
的类型为 vector<pthread_t>::iterator
。这意味着 *iter
将是 pthread_t
类型
所以你必须取消引用它:pthread_join(*iter, (void**)&returnValue);
注: &*iter
因此属于pthread_t *
类型,&iter
属于类型指向迭代器的指针。
正在处理一个简单的项目,使用线程统计多个 txt 文件。我在编译中遇到的唯一错误涉及 vector<pthread_t>::iterator
在 pthread_join
循环中使用。
错误是:
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,我认为我已经正确地跟踪了所有 pointers/reference/deference,但显然我在某处遗漏了一些东西。
我试过了:
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
但是迭代器根据定义是一个指针,那么取消引用它还不够吗?显式转换是解决方案的一部分吗?到目前为止,我所做的一切都没有奏效。
pthread_join()
的第一个参数应为 pthread_t。
您的迭代器 iter
的类型为 vector<pthread_t>::iterator
。这意味着 *iter
将是 pthread_t
所以你必须取消引用它:pthread_join(*iter, (void**)&returnValue);
注: &*iter
因此属于pthread_t *
类型,&iter
属于类型指向迭代器的指针。