Самое простое решение: отказаться от своего кода и просто позвонить https://developer.apple.com/documentation/coregraphics/cgfloat/2994408-random .
Строка в start_stopwatch()
:
rc = pthread_create(&thread_id, NULL, g_start_timer, (void *) &g_data_struct);
должен быть:
rc = pthread_create(&thread_id, NULL, g_start_timer, (void *) g_data_struct);
В первом случае Вы передаете "указатель на указатель", когда Вы действительно просто хотите передать указатель как аргумент потока.
До, когда освободить данные, существует много опций. Если Вы будете всегда передавать данные потока в выделенном блоке "кучи", то g_start_timer()
поток proc может освободить его, когда это закончило вытаскивать данные. Обратите внимание, что, если Вы делаете это, затем часть протокола для запуска потока - то, что блок аргумента потока должен быть выделенной "кучей".