Второй параметр для pthread_join
является void **
, то есть он ожидает указатель на void *
, который он разыменовывает для сохранения значения. Поскольку вы не передаете адреспеременная, эта функция будет пытаться использовать любое значение, которое вы передали в качестве адреса (который, вероятно, будет недействительным), и разыменовать его.Это вызывает неопределенное поведение .
Кроме того, первый параметр имеет тип pthread_t
, но вы передаете указатель на pthread_t
.
Вы также объявляете локальные переменные с теми же именами, что и вызываемые вами функции.В результате, когда вы вызываете pthread_create(&thread2,0,&oddsum,(void*)obj);
, вы фактически передаете локальную переменную int
с именем oddsum
, а не функцию с именем oddsum
.Вот почему он зависает.
Изменение имени переменных для хранения результатов, изменение вызовов pthread_join
для передачи адресов этих переменных и прямой передачи идентификаторов потоков должно работать:
int evenresult;
pthread_join(thread,(void**)&evenresult);
...
int oddresult;
pthread_join(thread2,(void**)&oddresult);
Однако правильным способом получения результата будет передача адресов действительных void *
переменных и их преобразование:
int evenresult, oddresult;
void *result;
pthread_join(thread, &result);
evensum = (intptr_t)result;
...
pthread_join(thread2, &result);
oddsum = (intptr_t)result;