2012-07-11 51 views
0

這裏是一個小例子,其示出了我的問題通函數指針給pthread_create,(C)

test.c的:

#include <stdio.h> 
#include <pthread.h> 

#define CORES 8 

pthread_t threads [ CORES ]; 
int threadRet [ CORES ]; 

void foo() 
{ 
    printf ("BlahBlahBlah\n"); 
} 

void distribute (void (*f)()) 
{ 
    int i; 

    for (i = 0; i < CORES; i++) 
    { 
     threadRet [ i ] = pthread_create (&threads [ i ], NULL, f, NULL); 
    } 
    for (i = 0; i < CORES; i++) 
    { 
     pthread_join (threads [ i ], NULL); 
    } 
} 

int main() 
{ 
    distribute (&foo); 
    return 0; 
} 

VIM/GCC輸出

test.c:20|11| warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default] 
/usr/include/pthread.h:225|12| note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)()’ 

什麼*/&,我需要添加/刪除PA ss foodistribute然後將它傳遞給線程?

回答

5
void *foo (void *x) 
{ 
    printf ("BlahBlahBlah\n"); 
} 

void distribute (void * (*f)(void *)) { 
    /* code */ 
} 

應該做的伎倆

因爲原型是:

extern int pthread_create (pthread_t *__restrict __newthread, 
          __const pthread_attr_t *__restrict __attr, 
          void *(*__start_routine) (void *), 
          void *__restrict __arg) __THROW __nonnull ((1, 3)); 
3

推薦的最小變化是:

void *foo(void *unused) 
{ 
    printf("BlahBlahBlah\n"); 
    return 0; 
} 

void distribute(void *(*f)(void *)) 
{ 
    ...as before... 
} 

pthread_create()功能想要一個指針,需要一個void *參數並返回一個void *結果(雖然你還沒有到這個錯誤還)的功能。因此,通過將foo()轉換爲一個函數,將void *參數作爲參數並返回void *結果,將它傳遞給該類型函數的指針。而且,對於它的價值,你幾乎可以肯定地將foo()變成一個靜態函數,因爲你不太可能直接從這個文件之外調用它。

+0

@DavidSchwartz我不跟隨 – puk 2012-07-11 02:18:02

+2

@puk:線程啓動程序必須採取'無效*'作爲參數,也必須返回一個'無效*'。你無法繞過這個要求。要調用'pthread_create',那就是你需要的函數類型,因爲這是它可以調用的唯一函數類型。 – 2012-07-11 02:18:48

+0

@DavidSchwartz:yup - 修正了你在評論的時候(雖然我在發佈原始版本的答案後記得返回類型)。謝謝。 – 2012-07-11 02:19:05

0

本頁面似乎可以解釋它相當不錯:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fapis%2Fusers_14.htm;

經常IBM文檔是非常好的,保持這些IBM鏈接的眼睛,當他們出現)。

所以,顯然你需要一個函數指針以在其參數空指針。嘗試

void distribute (void *(*f)(void *)) {...} 

您可能還需要更改foo的定義。有關函數指針,請參閱以下教程:http://www.cprogramming.com/tutorial/function-pointers.html。注意:我沒有自己測試過,所以不能保證它是否能夠正常工作 - 但我希望它至少能指出你正確的方向;)。

+0

IBM鏈接不起作用 – katta 2018-01-31 03:11:26