2012-01-26 11 views
1

は、私は、以下の機能を持っていると言う:C++では、戻り値の型を持つ関数のpthreadを作成しますか?

bool foo (int a); // This method declaration can not be changed. 

は、どのように私はこのためのpthreadを作成するのですか?そして、どのように関数が返すのかを調べるにはどうすればよいですか?私はオンラインで見ましたが、pthreadを作成する関数のように、を引数にとり、void*も返さなければなりません。私は返されたブールを得るでしょう。

私は=そう私と一緒に負担してください、C++に新たなんだ)

+1

私は無礼であるということではありませんが、C++を初めてお使いの場合は、言語を使用する経験が増えるまで、可能な限りスレッドから遠く離れないようにしてください。 –

+0

私は学生ですから、残念ながら、それは選択肢ではありません。それが何か慰めであるならば、私は以前にスレッドを使用していましたが、C++ではそうではありません – user1172252

+0

質問に必要ないくつかの重要なビット:関数はメンバ関数ですか?もしそうなら、それはインスタンスメンバかスタティックですか? –

答えて

5

限り、あなただけ(実際には、ある整数)boolsを扱っているとして、それが可能だ、ポインタがに対応しているようしかし(、pthreadの関数型に機能をキャストし、お勧めできませんいくつかの)整数型:

pthread_t pid; 
pthread_create(&pid, NULL, (void *(*)(void *))foo, (void *)argument)); 

しかし、あなたがより良い((自由でなければなりません)その戻り値へのポインタを返し、その後、別のものにpthreadの互換1をあなたの関数をラップと思います使用後の「D):

void *foo_wrapper(void *arg) 
{ 
    int a = *(int *)arg; 
    bool retval = foo(a); 
    bool *ret = malloc(sizeof(bool)); 
    *ret = retval; 
    return ret; 
} 

は次のように使用します。

pthread_t pid; 
pthread_create(&pid, NULL, foo_wrapper, &a); 

このメソッドを使用すると、将来、任意のリターンまたは引数型の関数を呼び出すことができます。

0

周りの簡単な作業では()、ブール& Bのint void *型のfooを使用することです。

+0

分かりやすくするために、bを返す直前の戻り値に設定してください。 –

+0

はい、私はそれをやりたかったのですが、残念ながら私はこの一般的な形式の関数をいくつも持っています。 – user1172252

+0

のためにpthreadを作成する必要があります。スレッドを初期化するときには常にboolの配列を作成し、 H2CO3の答えは、おそらくより良い習慣です。 –

0

boolは機能的にintと同等です。 falseは(通常)0で、trueは他のものです。したがって

void *foo(void *a){ 
    int *a_int = (int *)a; 
    //do things 
    bool *x = new bool; 
    *x = answer; 
    pthread_exit(x); 
} 

あなたのメインでは、それをboolに戻して返すことになります。

bool *x; 
pthread_join(thread,(void *)x); 
//Answer is *x 
+1

「偽」は(通常)「0」で、それ以外は「真」であると思います。 –

+0

十分です - あなたの言語を使用するように修正しました。 – Chris

1

あなたは関数オブジェクトで呼び出したい機能をカプセル化して、あなたのpthreadの機能の中から、その関数オブジェクトを呼び出すことができます:

まず、あなたの関数呼び出しをカプセル化する関数オブジェクトを定義します。

struct foo_functor { 
    // Construct the object with your parameters 
    foo_functor(int a) : ret_(), a_(a) {} 

    // Invoke your function, capturing any return values. 
    void operator()() { 
     ret_ = foo(a_); 
    } 

    // Access the return value. 
    bool result() { 
     return ret_; 
    } 

private: 
    bool ret_; 
    int a_; 
}; 

第2に、関数オブジェクトを呼び出す適切なpthreadシグネチャで関数を定義します。

// The wrapper function to call from pthread. This will in turn call 
extern "C" { 
    void* thread_func(void* arg) { 
     foo_functor* f = reinterpret_cast<foo_functor*>(arg); 
     (*f)(); 
     return 0; 
    } 
} 

最後に、あなたの関数オブジェクトをインスタンス化し、thread_func関数のパラメータとして渡します。

foo_functor func(10); 

pthread_t pid; 
pthread_create(&pid, NULL, thread_func, &func); 
pthread_join(pid, NULL); 

bool ret = func.result(); 
+0

ファンクタベースのソリューションでは+1により大きな汎用性 –

関連する問題