我正在尝试对二进制树的顺序遍历进行多线程处理 . 由于pthread_create,我收到错误 .
#include <iostream>
#include <pthread.h>
#include <list>
using namespace std;
static pthread_t threads[9];
static int count=0;
struct node
{
int value=0;
node *left=NULL;
node *right=NULL;
};
list<int> inordertraversal(node* n)
{
list<int> l1,l2;
if(n->left!=NULL)
list<int> l1=pthread_create(&threads[count++],NULL,inordertraversal,n->left);
if(n->right!=NULL)
list<int> l2=pthread_create(&threads[count++],NULL,inordertraversal,n->right);
list<int> l;
l.insert(l.begin(),l1.begin(),l1.end());
l.push_back(n->value);
l.insert(l.end()--,l2.begin(),l2.end());
return l;
}
struct node* newNode(int data)
{
node* node;
node->value=data;
node->left=NULL;
node->right=NULL;
return node;
}
int main()
{
struct node *root=newNode(7);
root->left=newNode(9);
root->right=newNode(5);
root->left->left=newNode(13);
root->left->right=newNode(17);
root->right->left=newNode(56);
root->right->right=newNode(21);
root->left->left->left=newNode(45);
root->right->left->right=newNode(45);
root->left->left->right=newNode(67);
list<int> l=inordertraversal(root);
for(list<int>::iterator it=l.begin();it!=l.end();it++)
{
cout<<*it<<" ";
}
}
我想使用pthread_create从传递给线程的函数返回列表元素 . 错误如下: -
/usr/include/pthread.h|244|error:初始化'int pthread_create的参数3(pthread_t *,const pthread_attr_t *,void *()(void),void *)'[-fpermissive] |
/home/dinu94/dummyspace/interview_prep/ThreadedBinaryTree/main.cpp|25|error:从'int'转换为非标量类型'std :: list'
/home/dinu94/dummyspace/interview_prep/ThreadedBinaryTree/main.cpp|28|error:从'std :: list()(node)'到'void *()(void)的无效转换'[-fpermissive] |
/usr/include/pthread.h|244|error:初始化'int pthread_create的参数3(pthread_t *,const pthread_attr_t *,void *()(void),void *)'[-fpermissive] |
/home/dinu94/dummyspace/interview_prep/ThreadedBinaryTree/main.cpp|28|error:从'int'转换为非标量类型'std :: list'
我不知道该怎么办 .
编辑:如果pthread_create是错误的方法,返回值的替代方法是什么?
谢谢
3 回答
pthread线程函数必须符合库指定的函数定义:
所以,你的函数
list<int> inordertraversal(node* n)
不符合void* ()(void)
您必须将函数签名更改为符合上述签名的函数,然后以递归方式调用 .
将
list<int> l;
作为类成员,这样您就不需要在每个函数调用时传递它 .你错误地解释了
pthread_create
的作用 . 它只是创建线程并返回线程创建的状态(它是否工作或失败) . 它根本不会返回结果 . 它可能应该更新一些可供所有线程访问的公共变量(此时需要使用互斥锁或其他一些互斥机制) .pthread_create需要一个函数指针,该函数指针的类型应为void *()(void *) . 您的函数有返回类型列表 .