Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Вам нужны реентерабельные подпрограммы. Реентерабельный программный код может вызываться несколько раз либо разными потоками, либо каким-то образом вложенными вызовами и при этом работать корректно. Следовательно, реентерабельная часть программного кода обычно должна применять локальные переменные таким образом, чтобы любой и каждый вызов кода получал собственную уникальную копию данных.
В многопоточных программах вы сообщаете компилятору, что вам нужно это средство, определяя в вашей программе макрос
_REENTRANT
#include
□ Некоторые функции получают безопасный реентерабельный вариант прототипа или объявления. При этом имя функции остается обычно прежним, но в конце добавляется суффикс
_r
gethostbyname
gethostbyname_r
□ Некоторые функции из файла stdio.h, которые обычно реализованы как макросы, становятся соответствующими реентерабельными безопасными функциями.
□ Переменная
errno
errno
Включение файла pthread.h предоставляет другие прототипы и определения, которые нужны в вашем программном коде, во многом так же, как делает stdio.h для подпрограмм стандартного ввода и вывода. В заключение следует убедиться в том, что вы включили в программу соответствующий заголовочный файл потоков и скомпоновали программу с подходящей библиотекой потоков, в которой реализованы функции семейства
pthread
pthread_create
fork
<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_t
NULL
void *(*start_routine)(void *)
Предыдущая строка просто говорит о том, что вы должны передать адрес функции, принимающей бестиповой указатель
void
void
fork
Возвращаемое значение равно 0 в случае успеха и номеру ошибки, если что-то пошло не так. В интерактивном справочном руководстве есть подробная информация об ошибочных ситуациях для этой и других функций, применяемых в данной главе.
pthread_create
pthread_
Когда поток завершается, он вызывает функцию
pthread_exit
exit
pthread_exit
<b>#include <рthread.h></b>
<b>void pthread_exit(void *retval);</b>
Функция
pthread_join
wait
<b>#include <рthread.h></b>
<b>int pthread_join(pthread_t th, void** thread_return);</b>
Первый параметр — это поток, который следует ждать, идентификатор, который для вас добывает функция
pthread_create
pthread_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);
}