Передача комментариев в ответ.
Вы говорите о процессах и потоках - не путайте их.
Если вывы работаете с потоками POSIX, все ваши функции имеют неправильную подпись;они должны быть похожи на void *thread1_func(void *unused) { … }
и должны закончить return NULL;
, хотя это немного спорный вопрос, так как все они имеют бесконечные петли в них на данный момент.
1012 * Ваши претензии 1, 30 и 120 секундных интервалыне оправданы показанным вами кодом.
У вас, похоже, есть одна глобальная переменная FILE *output
, которую потоки небрежно перезаписывают по своей прихоти.Это плохо.
В thread1_func()
у вас есть неинициализированный указатель char *c;
вместо char c;
- ой!Аналогичные жалобы в двух других функциях.
Вы не показали определения глобальных переменных o1_buff
и т. Д.Не ясно, будет ли основной поток обращаться к ним;если это так, у вас есть проблемы с управлением параллелизмом.
Пожалуйста, перечитайте о том, как создать MCVE ( Minimal, Complete, Verifiable Example ), и не забудьте создать MCVE, когда задаете вопросвот так.
Поскольку в этом коде нет вызова free()
, невозможно начать догадываться, где возникает проблема.Похоже, что вы работаете на Mac или, возможно, на машине BSD, учитывая сообщение о сбое.
Проблема заключалась в том, что я использовал только один указатель выходного файла для 3 файлов.Когда я разделил его, это исправило мою проблему.
Будьте осторожны с глобальными переменными - особенно общими - в программировании потоков.Хотя потоки ввода-вывода POSIX защищают дескрипторы открытых файлов от помех между потоками (дополнительную информацию см. В flockfile()
), они не защищают их от злоупотреблений, таких как различные вызовы fopen()
в разных потоках, вызывающиепеременная, которая должна быть сброшена, независимо от того, какой поток ее использует.
Самое простое решение - сделать переменную локальной для функций потока;тогда нет помех.Или создайте три глобальные переменные.Или, в качестве альтернативы, снова используйте мьютекс или аналогичный механизм управления доступом, чтобы предотвратить взаимодействие потоков друг с другом при использовании глобальной переменной.В этом контексте (и многих других) предпочтительнее делать переменную локальной, чем альтернативы.