好的,所以我正在查看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
答案 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);
}
};