如何将参数和函数传递给pthread_create

时间:2016-09-29 06:11:24

标签: c++ pthreads parameter-passing

好的,所以我正在查看pthread_create的文档,我根本不明白如何做我想做的事情。

我想调用pthread_create,它将在pthread_t的结构中传递obv。但是我传递给它的函数接受一个指向MyNode *的指针。我如何将该函数作为参数传递,并将“this”作为参数传递给该函数。

//MyNode field and method in class file
pthread_t myTrd;  

static void compute(MyNode* node);

////////////////////////////////////////////////////////////
//Actual code in header file below
static void MyNode::compute(*MyNode node){ //L61
  //code
}

void MyNode::run(){ //run function in header file
    pthread_create(&(this->thread),NULL,MyNode::compute, this);
}

结果:

myNode.cpp:61: error: 'static' may not be used when defining (as opposed to declaring) a static data member
myNode.cpp:61: error: 'int MyProjectGraph::MyNode::compute' is not a static member of 'class MyProjectGraph::MyNode'
myNode.cpp:61: error: expected primary-expression before 'node'
myNode.cpp:61: error: expected ',' or ';' before '{' token
myNode.cpp:134: error: expected `}' at end of input

2 个答案:

答案 0 :(得分:2)

传递给pthread_create()的函数应与原型匹配:

void *function(void *arg);

如果你的函数与你的函数不匹配,你必须使用暴力和无知(和强制转换)来使函数指针可以接受 - 然后希望替代界面不会破坏任何东西。

让你的功能符合规范要好得多:

void *function(void *arg)
{
    MyNode *mnp = (MyNode *)arg;
    …
    return 0;
}

如果你有一个可用的返回值可以返回一些更有意义的值,但返回null(你可能会写nullptr,因为你主要使用的是C ++)。

注意pthread_create()本身通常是一个C函数,并且在它传递的函数指针中需要C函数语义。

答案 1 :(得分:0)

每个对象拥有一个线程并不是一个好方法。我认为 因为你正在将你的对象称为一个节点,所以你有一堆它们 并希望在线程上对他们做点什么。 我通常会做以下,这是一个经典的习语:

class Worker
{
    struct ThreadStr
    {
        Worker * worker;
        // put parameters here
        MyNode * node;
};


public:

    static void *StaticHandler(void *pvoid)
    {
        ThreadStr * data = (ThreadStr*)pvoid;
        data->worker->Compute(data->node);
        delete data;
        return NULL;
    }

    void Compute(MyNode *node)
    {
        // whatever you want to compute on a node.
    }

    // start a thread to execute Worker::Compute(MyNode*)
    void Run(MyNode *node)
    {
        ThreadStr * data = new ThreadStr();
        data->worker = this;
        data->node = node;

        pthread_t threadId;
        pthread_create(&threadId, NULL, Worker::StaticHandler, data);

    }

};