c ++ pthread_create返回值

时间:2015-10-04 04:20:29

标签: c++ multithreading

我正在尝试对二叉树的顺序遍历进行多线程处理。由于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是错误的做法,有什么方法可以返回值?

由于

3 个答案:

答案 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 *)。 您的函数有返回类型列表。