2012-10-17 208 views
0

我試圖使用具有這樣定義的線程啓動功能的線程庫:如何將一個函數指針傳遞給這個函數

int vg_thread_create(VGThreadFunction func, 
    void *arg, 
    VGThreadDescriptor *tid, 
    void *stack, 
    size_t stack_size, 
    long priority, 
    int flags); 

而且VGThreadFunction是下面的typedef:

typedef void* (*VGThreadFunction) (void*) 

爲了論證的緣故,我有這樣的功能:

void doit() { 
    cout << "Woohoo printing stuff in new thread\n"; 
} 

這個簽名函數不是void * func(void *) - 我是否被迫使用這樣的函數簽名?

如果我嘗試:

VGThreadFunction testfunc = &doit; 

我得到

錯誤C2440: '初始化':無法從 '無效(__cdecl *)(無效)' 到 'VGThreadFunction'

如何轉換我使用vg_thread_create?

編輯

我嘗試這樣做:

void* doit(void* donothingvar) { 
    cout << "printing stuff in new thread\n"; 
    return donothingvar; 
} 

然後在功能:

VGThreadFunction testfunc = (VGThreadFunction)doit; 

int ret = vg_thread_create(testfunc, 0, 0, 0, 0, 0, 0); 

我然後調用vg_thread_create時收到訪問衝突。

如果我踏入時,它調用_beginthreadex

Unhandled exception at 0x0040f5d3 in threadtest.exe: 0xC0000005: Access violation writing location 0x00000000. 

任何想法,它實際上崩潰的功能?

通過進入函數我解決了我不得不傳入一個有效的指針 - 傳遞零導致空解除引用。對不起,有點具體。

回答

6

是的,函數簽名必須匹配。只需在你的函數中添加一個虛擬參數。

+0

爲什麼要投它不工作? – 2012-10-17 18:19:33

+0

@ H2CO3,取決於編譯器使用的參數傳遞約定,它可能會搞砸了。即使它有效,我也確信它是未定義的行爲。 –

+0

標準報價請 – 2012-10-17 18:22:33