首页 文章

c pthread_create返回值

提问于
浏览
1

我正在尝试对二进制树的顺序遍历进行多线程处理 . 由于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 回答

  • 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; 作为类成员,这样您就不需要在每个函数调用时传递它 .

  • 0

    你错误地解释了 pthread_create 的作用 . 它只是创建线程并返回线程创建的状态(它是否工作或失败) . 它根本不会返回结果 . 它可能应该更新一些可供所有线程访问的公共变量(此时需要使用互斥锁或其他一些互斥机制) .

  • 0

    pthread_create需要一个函数指针,该函数指针的类型应为void *()(void *) . 您的函数有返回类型列表 .

相关问题