我正在尝试对二叉树的顺序遍历进行多线程处理。由于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'required |
/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是错误的做法,有什么方法可以返回值?
由于
答案 0 :(得分:3)
pthread线程函数必须符合库指定的函数定义:
int pthread_create(pthread_t*, const pthread_attr_t*, void* ()(void), void*)
因此,您的函数list<int> inordertraversal(node* n)
不符合void* ()(void)
您必须将您的函数签名更改为符合上述签名的函数,然后以递归方式调用该函数。
void* inorder(void)
{
pthread_create(&threads[count++],NULL,wrapper,(void *)n->left);
}
让list<int> l;
作为类成员,这样你就不需要在每个函数调用时传递它。
答案 1 :(得分:0)
你错误地解释了pthread_create
的作用。它只是创建线程并返回线程创建的状态(它是否工作或失败)。它根本不处理线程中运行的函数返回的内容。事实上,线程函数可能根本不应该返回结果。应该更新一些可供所有线程访问的公共变量(此时需要使用互斥或其他一些互斥机制)。
答案 2 :(得分:0)
pthread_create需要一个函数指针,该函数指针的类型应为void *()(void *)。 您的函数有返回类型列表。