2010-03-06 3 views
0

Visual Studio C++ 2008многопоточность с использованием параметров _beginthreadex

Я использую потоки. Однако у меня есть это предупреждение и не знаю, что я делаю неправильно.

1. unsigned int (__stdcall *)(void *) differs in levels of indirection from 'void *(__stdcall *)(void *)' 
2. _beginthreadex different types for formal and actual parameters 3 

/* Function prototype */ 
void* WINAPI get_info(void *arg_list) 

DWORD thread_hd; 
DWORD thread_id; 

/* Value to pass to the function */ 
int th_sock_desc = 0; 

/* Create thread */ 
thread_hd = _beginthreadex(NULL, 0, get_info, (void*) th_sock_desc, 0, &thread_id); 
if(thread_hd == 0) 
{ 
    /* Failed to create thread */ 
    fprintf(stderr, "[ %s ] [ %s ] [ %d ]\n", strerror(errno), __func__, __LINE__); 
    return 1; 
} 
+0

(void *) th_sock_desc -> & th_sock_desc? –

+0

Опасайтесь, что вы должны вызвать CloseHandle() для возвращаемого значения. boost :: thread может быть лучшей мышеловкой здесь. –

ответ

1

функция Thread, что вы передаете _beginthreadex имеет прототип, чем тот, который вы передаете _beginthread

uintptr_t _beginthread( 
    void(*start_address)(void *), 
    unsigned stack_size, 
    void *arglist 
); 
uintptr_t _beginthreadex( 
    void *security, 
    unsigned stack_size, 
    unsigned (*start_address)(void *), 
    void *arglist, 
    unsigned initflag, 
    unsigned *thrdaddr 
); 

Это то же, что CreateThread ожидает,

DWORD WINAPI ThreadProc(
    __in LPVOID lpParameter 
); 

Так вы необходимо изменить сигнатуру функции вашего потока потока на

unsigned WINAPI get_info(void *arg_list) 

удалить WINAPI и изменить тип возврата.

Edit:

WINAPI действительно необходимо, то документы показывают неправильный прототип _beginthredex, но они явно указать, что необходима __stdcall. Ваша проблема - это только возвращаемый тип. Кроме того, сообщение об ошибке, говорит о том, что ожидается __stdcall, чтобы он его урегулировал.

+0

Я думал, что мне понадобится WINAPI, так как это поддерживает __stdcall. Как ожидает _beginthreadex. Благодарю. – ant2009

+0

WINAPI - это __stdcall. но _beginthreadex ожидает __cdecl. CreateThread ожидает __stdcall. –

+0

_beginthread ожидает __cdecl, в _beginthreadex прототип должен быть __stdcall (или __clrcall), поэтому WINAPI в порядке. –

Смежные вопросы