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.
任何想法,它實際上崩潰的功能?
通過進入函數我解決了我不得不傳入一個有效的指針 - 傳遞零導致空解除引用。對不起,有點具體。
爲什麼要投它不工作? – 2012-10-17 18:19:33
@ H2CO3,取決於編譯器使用的參數傳遞約定,它可能會搞砸了。即使它有效,我也確信它是未定義的行爲。 –
標準報價請 – 2012-10-17 18:22:33