使用 vector<pthread_t>::iterator 创建和连接 pthread

Creating and Joining pthreads using vector<pthread_t>::iterator

正在处理一个简单的项目,使用线程统计多个 txt 文件。我在编译中遇到的唯一错误涉及 vector<pthread_t>::iteratorpthread_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属于类型指向迭代器的指针。