Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Многопотоковая обработка


Автор: Airanius 11.1.2006, 08:27
Доброго времени суток!

Помогите в решении вопроса: Написал программу под Винду, которая в три потока обрабатывает входящие данные. Теперь возникла необходимость создать её же под Linux. Сделал разделения потоков с помощью функции fork(), вот только получилось, что общие переменные у каждой нити свои! Подскажите как это обойти, или может нужно по другому организовать многопотоковую обработку? (каждая нить представлена отдельной функцией, но может вызывать общие вспомогательные подпрограммки). Заранее спасибо!

Автор: bilbobagginz 14.1.2006, 16:48
ты не сделал правильное разделение на "потоки": В линуксе между "процессами" и "потоками" есть серьезная разница.
используй библиотеку потоков напр. pthreads ( POSIX threads ) или nptl ( native posix threads library )

используя функции pthread_*
ессно надо связывать с либой при сборке:
Код

gcc -lpthreads my_threads_program.c -o my_threads_program



Автор: comcon1 20.1.2006, 16:57
Действительно, вызов fork делает совсем не то. Он производит "митоз" программы smile, говоря биологическим языком. Получается две копии программы в памяти, различающихся только PID-ом и PID-ом процесса-родителя.

Далее две эти копии программы выполняются СОВЕРШЕННО НЕЗАВИСИМО. Для того чтобы узнать, в какой из копий программы ты находишься, необходимо проверить, что вернула функция fork(). Если 0, то ты в дочернем процессе. В материнском процессе fork возвращает значение PID-а дочернего процесса. Общаться эти два процесса могут только при помощи сигналов (см. signals.h).

Хотя при создании потока, также запустив top, ты увидишь два процесса. Однако в отличие от предыдущего случая переменные там будут общие smile.

Автор: bilbobagginz 24.1.2006, 12:43
comcom1, насчет общения... зависит от характера общения... там можно и через сигналы, через пайпы, и через сокеты разные, и через зашаренную память... имхо конечно.
и есссно, вопрос сколько вся эта коммуникация стоит времени и памяти..

пока.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)