使用 vector::itrator 创建和连接 pthreads<pthread_t>

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

本文关键字:lt pthread gt pthreads itrator vector 创建 连接 使用      更新时间:2023-10-16

处理一个简单的项目,使用线程来统计多个txt文件。我在编译中遇到的唯一错误涉及pthread_join循环中使用的vector<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但迭代器根据定义是一个指针,那么取消引用它还不够吗?显式强制转换是解决方案的一部分吗?到目前为止,我尝试过的任何方法都没有奏效。

pthread_join()的第一个参数应为pthread_t。

您的迭代器iter类型为 vector<pthread_t>::iterator 。 这意味着*iter将属于 pthread_t 类型

所以你必须取消引用它:pthread_join(*iter, (void**)&returnValue);

注意: 因此,&*iter 的类型为 pthread_t *&iter 的类型是指向迭代器的指针。