Я предполагаю, что вы, вероятно, используете 64-битную систему.
Ваша проблема в pthread_join:
int n,ret;
pthread_join(thread_id,(void**)&ret);
В 64-битных системах int
s 32 бит, но void*
64 бит.Итак, вы пытаетесь хранить 64 бита в 32-битной переменной.В результате вы перезаписываете другие места в стеке и просто делаете кучу вещей.Обязательно восстановите значение в истинное void *
, и все должно работать лучше.Еще лучше использовать указатель void*
в качестве истинного указателя;Например, вы можете передать указатель на int
в качестве аргумента функции потока и использовать его в качестве аргумента, а затем записать результат в то же место.
Кстати, GCC предупреждает об этом, даже безлюбые предупреждающие переключатели:
test.c:30: warning: cast to pointer from integer of different size
Пожалуйста, не игнорируйте эти предупреждения.