Читайте также:
|
|
1. Каково назначение системных вызовов wait, waitpid?
2. Как в родительском процессе можно узнать о завершении дочернего процесса, не прерывая основной работы?
3. Каково назначение директивы #define в программе procmemory.c?
4. Каков смысл переменных etext, edata и end в программе procmenory.c? Почему эти переменные объявлены с атрибутом extern?
5. Пусть в родительском процессе некоторой переменной было присвоено значение до создания дочернего процесса. Будет ли эта переменная доступна в дочернем процессе? Каково будет ее значение в начальный момент времени? Если родительский процесс будет изменять значение переменной, то будет ли это изменение доступно дочернему процессу? А наоборот?
---------------------------------------------------------------------------------------------------
© Лабораторная работа подготовлена А.Е. Костиным (части II и III), Л.В. Илюшечкиной.
Потоки в ОС Linux
Цель работы: знакомство с системными вызовами для управления потоками в ОС Linux.
I. Управление потоками
Основная цель использования потоков - это разделение программы на подзадачи, которые могут выполняться параллельно. По сравнению с процессами взаимодействие и синхронизация потоков требует меньше времени, поскольку потоки одного процесса выполняются в одном адресном пространстве.
В ОС UNIX/Linux имеется API для потоков стандарта POSIX (Portable Operating System Interface) - pthreads ("P" - от POSIX). Прототипы функций работы с потоками и необходимые типы данных содержатся в заголовочном файле <pthread.h>. Эти функции не включены в стандартную библиотеку языка С, они находятся в библиотеке libthread. Поэтому в командную строку для компоновки необходимо добавить опцию (см. лабораторную работу 2)
-lpthread
Каждый поток имеет свой идентификатор потока, ID потока. В программах на С/С++ для ID потоков следует использовать тип pthread_t из <sys/types/.h>.
Создание и завершение потоков
Создание потока. Поток создается функцией pthtead_create, имеющей 4 параметра:
1. Указатель на переменную типа pthread_t, в нее будет записан ID нового потока.
2. Указатель на объект атрибут потока. Этот объект управляет деталями взаимодействия потока с остальной программой. Если параметр равен NULL, то поток будет создан с атрибутами по умолчанию.
3. Указатель на функцию потока. Это обычный указатель на функцию типа void*(*)(void*), т.е. функция потока принимает один параметр типа указатель на void и возвращает значение типа указатель на void..
4. Значение атрибута потока типа void*. Это значение передается потоку как аргумент в функцию потока. Через него можно передать новому потоку параметры.
После создания каждый поток выполняет функцию потока - обычную функцию в программе пользователя. При завершении этой функции поток завершается.
Возврат из функции pthread_create происходит немедленно, и исходный поток продолжает выполнение команд, следующих за вызовом pthread_create. Одновременно новый поток начинает выполнение функции потока. Функция pthread_create возвращает ноль в случае успеха или не ноль в случае ошибки.
Завершение потока. При нормальных условиях поток завершается двумя способами:
1. Обычный возврат из функции потока. Величина, возвращаемая return, будет являться значением, возвращаемым потоком.
2. Возврат при помощи функции pthread_exit. Она может быть вызвана из любой функции данного потока. Аргумент этой функции будет являться значением, возвращаемым потоком.
Задание 1. Выполните программу pr1.c. Программа создает поток, который непрерывно печатает ' x ' на устройстве stderr. После создания потока главный поток непрерывно печатает 'o' на stderr. (Приостановить выполнение программы можно при помощи Ctrl-s; возобновить - любой клавишей. Снять программу можно при помощи Ctrl-c.)
/* pr1.c */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* print_xs (void* unused)
{
while (1)
fputc (‘x’, stderr);
return NULL;
}
int main ()
{
int p;
pthread_t thread_id;
p = pthread_create (&thread_id, NULL, &print_xs, NULL);
if (p!= 0) { perror("Thread problem"); exit(1);}
while (1)
fputc (‘o’, stderr);
return 0;
}
Что произойдет, если stderr заменить на stdout? Добавьте в программу печать идентификаторов обоих потоков, убрав операторы цикла while. Воспользуйтесь функцией pthread_self (Возвращает ID потока, в котором была вызвана. Не имеет параметров.).
Дата добавления: 2014-12-18; просмотров: 37 | Поможем написать вашу работу | Нарушение авторских прав |