2013-11-03 44 views
1

我想創建n個線程。然後向它們傳遞一個結構體以用數據填充該結構體;例如bool來跟蹤線程是否完成或被終止信號中斷。創建線程並將結構傳遞給它

n = 5; // For testing. 

pthread_t threads[n]; 
for(i=0; i<n; i++) 
    pthread_create(&threads[i], &thread_structs[i], &functionX); 

假設thread_structs已經配對了。

functionX()注意功能沒有參數。我應該爲結構創建一個參數嗎?或者我傳遞的結構是好的?

我該如何指向剛剛傳遞給函數的結構?

+0

爲什麼你會傳遞它作爲void而不是結構類型? –

+0

「void *」是泛型指針類型 - 所有指針可衰減爲「void *」,而不會出現轉換錯誤。這允許pthread_create的通用定義,而不必知道定製/未來類型。如果它被定義爲一個'thread_struct *'並且你想傳遞一個指向int的指針,那麼你就必須進行一次強制轉換。 – kfsone

+1

或者更簡單的說法:取一個void *是一種說法,它會指向任何東西。不利的一面是,它實際上是以void *的形式到達的,而您必須將其重新放回到界面的一側。這應該提醒你「這可能是一個指向任何東西,要小心」 – kfsone

回答

5

這不是你如何使用在pthread_create:

http://man7.org/linux/man-pages/man3/pthread_create.3.html

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

的第三個參數是你的例行公事,第四是將被轉發到你的常規參數。你的程序應該是這樣的:

void* functionX(void* voidArg) 
{ 
    thread_struct* arg = (thread_struct*)voidArg; 
    ... 

和並行線程調用應該是:

pthread_create(&threads[i], NULL, functionX, &thread_structs[i]); 

(除非你有一個pthread_attr_t供應作爲第二個參數)。

+0

我不應該通過&thread_structs [i]? –

+0

確實 - 修正了。得到了一點點搗亂在該死的kindle上鍵入非alphanum符號:) – kfsone

+0

我決定添加另一個參數到functionX。編譯器會拋出「太多的參數到函數'pthread_create'。除了把所有參數放到我的結構體中,我可以通過儘可能多的參數來解決這個問題嗎? –

2

申報functionX

void* function functionX(void* data) { 
} 

再投data到任何指針類型的&thread_structs[i]是,把它作爲你請。

+0

謝謝你。 –