簡體   English   中英

如何將參數和函數傳遞給pthread_create

[英]How to pass parameters and function to pthread_create

好的,所以我在看pthread_create的文檔,而我根本不了解如何做自己想做的事情。

我想調用pthread_create,它將通過pthread_t的結構進行傳遞。 但是我傳遞給它的函數需要一個指向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

傳遞給pthread_create()的函數應與原型匹配:

void *function(void *arg);

如果您的函數與之不匹配,則必須使用蠻力和無知(和強制轉換)來使函數指針可接受-然后希望替代接口不會破壞任何內容。

使您的函數符合規范要好得多:

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

如果有一個可用的值,則返回值可以返回一些更有意義的值,但是返回空值(如果您主要使用C ++,則可以編寫nullptr )。

請注意, pthread_create()通常本身是C函數,並且在傳遞的函數指針中期望C函數語義。

每個對象都有一個線程並不是一個好方法。 我假設由於您正在將對象稱為節點,因此您有一堆對象,並且想要在線程上對其執行某些操作。 我通常會執行以下操作,這是經典的成語:

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);

    }

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM