Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Создание и завершение потоков

Читайте также:
  1. II. Речевая деятельность человека. Создание текста. Коммуникативные качества хорошей речи и способы их достижения
  2. II. Сравнение потоков и процессов
  3. III. Завершение
  4. III. Организация и проведение натуральных обследований структуры и интенсивности автотранспортных потоков на основных автомагистралях
  5. IV. Закрепление полученного материала и завершение занятия
  6. LINUX|| Реализация потоков в ОС Linux.
  7. А) создание Лиги Наций
  8. А. Создание Правил эксплуатации и назначение ответственных за их соблюдение
  9. Ассемблер. Регистры микропроцессоров 8086-80186. Сегментация памяти в DOS. Создание циклов.
  10. Базова підтримка багатопотоковості

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 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав