說我有以下功能:C++,爲返回類型的函數創建一個pthread?
bool foo (int a); // This method declaration can not be changed.
如何創建這樣的並行線程?我怎麼知道這個函數返回的是什麼?我在網上看過,似乎任何我想創建pthread的函數都必須以void*
作爲參數,並且必須返回void*
,而且我不太確定如何對所有這些工作進行投射,或者我會得到返回的布爾。
我是新的C++,所以請多多包涵=)
說我有以下功能:C++,爲返回類型的函數創建一個pthread?
bool foo (int a); // This method declaration can not be changed.
如何創建這樣的並行線程?我怎麼知道這個函數返回的是什麼?我在網上看過,似乎任何我想創建pthread的函數都必須以void*
作爲參數,並且必須返回void*
,而且我不太確定如何對所有這些工作進行投射,或者我會得到返回的布爾。
我是新的C++,所以請多多包涵=)
至於你與布爾變量只處理(其中,實際上,整數),這是可能的,但是不推薦使用,在功能轉換爲並行線程函數類型,指針是兼容(某些)整數類型:
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);
使用此方法,將來您將能夠使用任意返回或參數類型調用函數。
一個簡單的解決辦法是使用無效*富(INT一個,布爾& B)。
爲了清楚起見:在返回之前立即將b設置爲返回值。 –
是的,我想這樣做,但不幸的是我有一些這種通用格式的函數,我需要爲 – user1172252
創建pthreads。您可以隨時創建一個bools數組,並在初始化這些線程時使用索引,但是H2CO3的答案可能是更好的做法。 –
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
我認爲你的意思是'false'(通常)是'0',其他的都是'true'。 –
公平 - 修復它使用你的語言。 – Chris
您可以封裝你想在一個函數對象調用函數,然後調用該函數對象從您的並行線程函數中:
首先,定義一個函數對象,它封裝了你的函數調用。
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();
+1爲基於仿函數的解決方案提供了更大的通用性 –
我的意思不是粗魯,但如果您是C++的新手,那麼我建議您儘可能遠離線程,直到您獲得更多使用該語言的經驗。 –
我是一名學生,不幸的是,這不是一個選項。如果它是任何安慰,我已經使用過線程,而不是在C++ – user1172252
需要在問題中的幾個重要的位:函數是成員函數嗎?如果是這樣,它是一個實例成員還是靜態的? –