Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Вам нужны реентерабельные подпрограммы. Реентерабельный программный код может вызываться несколько раз либо разными потоками, либо каким-то образом вложенными вызовами и при этом работать корректно. Следовательно, реентерабельная часть программного кода обычно должна применять локальные переменные таким образом, чтобы любой и каждый вызов кода получал собственную уникальную копию данных.
В многопоточных программах вы сообщаете компилятору, что вам нужно это средство, определяя в вашей программе макрос
_REENTRANT#include□ Некоторые функции получают безопасный реентерабельный вариант прототипа или объявления. При этом имя функции остается обычно прежним, но в конце добавляется суффикс
_rgethostbynamegethostbyname_r□ Некоторые функции из файла stdio.h, которые обычно реализованы как макросы, становятся соответствующими реентерабельными безопасными функциями.
□ Переменная
errnoerrnoВключение файла pthread.h предоставляет другие прототипы и определения, которые нужны в вашем программном коде, во многом так же, как делает stdio.h для подпрограмм стандартного ввода и вывода. В заключение следует убедиться в том, что вы включили в программу соответствующий заголовочный файл потоков и скомпоновали программу с подходящей библиотекой потоков, в которой реализованы функции семейства
pthreadpthread_createfork<b>#include <pthread.h></b><b>int pthread_create(pthread_t * thread, pthread_attr_t *attr,</b><b> void *(*start_routine)(void *), void *arg);</b>Прототип выглядит внушительно, но функцию очень легко применять. Первый аргумент — указатель на переменную типа
pthread_tNULLvoid *(*start_routine)(void *)Предыдущая строка просто говорит о том, что вы должны передать адрес функции, принимающей бестиповой указатель
voidvoidforkВозвращаемое значение равно 0 в случае успеха и номеру ошибки, если что-то пошло не так. В интерактивном справочном руководстве есть подробная информация об ошибочных ситуациях для этой и других функций, применяемых в данной главе.
pthread_createpthread_Когда поток завершается, он вызывает функцию
pthread_exitexitpthread_exit<b>#include <рthread.h></b><b>void pthread_exit(void *retval);</b>Функция
pthread_joinwait<b>#include <рthread.h></b><b>int pthread_join(pthread_t th, void** thread_return);</b>Первый параметр — это поток, который следует ждать, идентификатор, который для вас добывает функция
pthread_createpthread_createВыполните упражнение 12.1.
Данная программа создает один дополнительный поток, показывает, что он совместно с исходным потоком использует переменные и заставляет новый поток вернуть результат исходному потоку. Далее приведена программа thread1.с.
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>void *thread_function(void *arg);char message[] = "Hello World";int main() { int res; pthread_t a_thread; void *thread_result; res = pthread_create(&a_thread, NULL, thread_function, (void *)message); if (res ! = 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); }
