2010-04-13 90 views
1

Iam新增了c編程,需要一些幫助。posix pthreads in c

long *taskids[NUM_THREADS]; 

for(t=0; t<NUM_THREADS; t++) 
{ 
    taskids[t] = (long *) malloc(sizeof(long)); 
*taskids[t] = t; 
    printf("Creating thread %ld\n", t); 
    rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t]); 
    ... 
} 

此代碼片段演示瞭如何將簡單整數傳遞給每個線程。調用線程爲每個線程使用一個唯一的數據結構,確保每個線程的參數在整個程序中保持不變。 Iam不能理解這是怎麼發生的,有人可以解釋它?

+0

如果您不熟悉C編程,可能會有比pthread更復雜的開始位置。 – WhirlWind 2010-04-13 01:29:45

+0

你從哪裏找到這段代碼片段? – clahey 2010-04-13 01:33:25

+0

https://computing.llnl.gov/tutorials/pthreads/#PthreadsAPI – Jony 2010-04-13 01:38:01

回答

2

該代碼正在做什麼是存儲指向已分配數據的指針數組。每個線程都分配了很長的空間,然後傳遞一個指向該值的指針。這給了線程一個工作的地方,主線程仍然可以訪問。

這可以用少一點的分配來實現:

long taskids[NUM_THREADS]; 

for(t=0; t<NUM_THREADS; t++) 
{ 
    taskids[t] = t; 
    printf("Creating thread %ld\n", t); 
    rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &taskids[t]); 
    ... 
} 

雖然這並降低靈活性,從而釋放TaskID的。它還要求這個函數在所有線程完成之前不會返回。

+0

我其實不喜歡這段代碼。該功能不返回的要求是脆弱的。原文更可取,因爲它沒有太多的失敗潛力。 – clahey 2010-04-13 22:44:03

3
  • malloc分配足夠的內存來保存一個長整數。它返回一個長指針,一個long*
  • long*存儲到taskids[t],以便它可以稍後使用。
  • pthread_create被調用。其中一個參數是要傳遞給新線程的值。
    • 由於pthread_create函數不知道程序員想要傳遞什麼樣的值,所以它使用一個void*,它可以是指向任何東西的指針。 taskids[t]是指向一個長整數的指針。它被投射(這是(void *))到一個空指針並作爲參數給予pthread_create
  • pthread_create創建一個新的線程,並調用PrintHello函數並傳遞空隙指針taskids[t]作爲值到PrintHello
  • 一旦PrintHello開始,它會將void指針轉換回長指針,然後它可以訪問包含其taskid的長整數。