2012-01-26 93 views
1

說我有以下功能:C++,爲返回類型的函數創建一個pthread?

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

如何創建這樣的並行線程?我怎麼知道這個函數返回的是什麼?我在網上看過,似乎任何我想創建pthread的函數都必須以void*作爲參數,並且必須返回void*,而且我不太確定如何對所有這些工作進行投射,或者我會得到返回的布爾。

我是新的C++,所以請多多包涵=)

+1

我的意思不是粗魯,但如果您是C++的新手,那麼我建議您儘可能遠離線程,直到您獲得更多使用該語言的經驗。 –

+0

我是一名學生,不幸的是,這不是一個選項。如果它是任何安慰,我已經使用過線程,而不是在C++ – user1172252

+0

需要在問題中的幾個重要的位:函數是成員函數嗎?如果是這樣,它是一個實例成員還是靜態的? –

回答

5

至於你與布爾變量只處理(其中,實際上,整數),這是可能的,但是不推薦使用,在功能轉換爲並行線程函數類型,指針是兼容(某些)整數類型:

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

不過,你最好換你的函數到另一個,並行線程兼容的一個,然後返回一個指向它的返回值(必須是免費的()'使用後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

一個簡單的解決辦法是使用無效*富(INT一個,布爾& B)。

+0

爲了清楚起見:在返回之前立即將b設置爲返回值。 –

+0

是的,我想這樣做,但不幸的是我有一些這種通用格式的函數,我需要爲 – user1172252

+0

創建pthreads。您可以隨時創建一個bools數組,並在初始化這些線程時使用索引,但是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 *x; 
pthread_join(thread,(void *)x); 
//Answer is *x 
+1

我認爲你的意思是'false'(通常)是'0',其他的都是'true'。 –

+0

公平 - 修復它使用你的語言。 – Chris

1

您可以封裝你想在一個函數對象調用函數,然後調用該函數對象從您的並行線程函數中:

首先,定義一個函數對象,它封裝了你的函數調用。

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_; 
}; 

其次,用適當的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爲基於仿函數的解決方案提供了更大的通用性 –

相關問題