2016-09-29 2 views
1

これで、pthread_createのドキュメントを見ています。私がやりたいことをどうやってやっているのか分かりません。pthread_createにパラメータと関数を渡す方法

pthread_tの構造体でobvが渡すpthread_createを呼び出すとします。しかし、私が渡す関数は、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

この '静的な無効MYNODE ::コンピューティング(* MYNODEノード){'コンパイルされませんが、それをしませんか? –

+0

@JonathanLeffler nope。 – Qubit

+0

MCey([MCVE])が役に立つと思うことが分かるように、 'class MyNode'を十分に表示するのが最善です。エラーメッセージの最初の行には "クラス定義の中に' static void compute(...) 'を書きますが、定義に' static'を含めていません。あなたの 'compute'関数が何をしているのかを確かめるのは難しいです。あなたが 'pthread_t myTrd;'をなぜ表示するのかは明らかではありません。完全に使用されていないようです。 –

答えて

2

プロトタイプと一致している必要がありpthread_create()に渡された関数:

void *function(void *arg); 

あなたの関数が一致しない場合は、ブルートフォースと無知を(使用する必要がありますキャスト)を使用して、関数ポインタを受け入れ可能にします。そして、代替インタフェースが何かを破壊しないことを望みます。

あなたの関数が仕様を一致させるためにはるかに良いです:

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

あなたが可能なものを持っている場合、リターンは、いくつかのより意味のある値を返すことができますが、ヌルを返します(あなたはおそらくことを考えるとnullptrを書くことができ主にC++を使用しています)。

通常、pthread_create()はC関数自体であり、渡される関数ポインタにはC関数セマンティクスが必要であることに注意してください。

+0

私が '...'を置くところでは、あなたはもともと意図したものの身体を入れます。 'this'を渡すことはおそらく正しい設計選択ではないことに注意してください。あなたの 'MyNode'クラスに' pthread_t thread'メンバがある場合、そのメンバへのポインタを最初の引数として使うことができます。私が 'function'を使ったところでは、クラスメンバ関数ではなく、' extern "C" 'と修飾されていれば安全ですが、実際に' pthread'コードをC++で書いた人は、そうでなければ、void * compute(void * arg){...} 'のような助言をしてください)、それを関数ポインタの引数として渡します。 –

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

    } 

}; 
関連する問題