[英]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.