Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_ПСРВ.doc
Скачиваний:
26
Добавлен:
12.02.2016
Размер:
1.6 Mб
Скачать

Текст программы

#include <stdio.h>

#include <pthread.h>

#include <sys/neutrino.h>

pthread_t thread_id1;

pthread_t thread_id2;

void * long_thread1(void *notused)

{

int n;

for(n=0;n<5;n++)

{

printf("Eto pervii potok , TID %d - N povtora %d \n", thread_id1, n );

sleep(2);

}

}

void * long_thread2(void *notused)

{

int m;

for(m=0; m<5; m++)

{

printf("Eto vtoroi potok , TID %d - N povtora %d \n", thread_id2 , m );

sleep(1);

}

}

int main(void)

{

printf("Prog threads PID %d \n",getpid());

pthread_create(&thread_id1, NULL, long_thread1, NULL);

pthread_create(&thread_id2, NULL, long_thread2, NULL);

sleep(40);

return(1);

}

В программе создаются и запускаются на исполнение два потока. Когда один поток приостанавливается, сразу начинает работу другой. Приостановка реализована функцией sleep(n), которая останавливает процесс на n секунд. На экране можно наблюдать, как по очереди работают два процесса.

Результаты

# gcc pthread.c

# `pwd`a.out

Prog threads PID 852000

Etot pervii potok , TID 0 - N povtora 0

Etot vtoroi potok , TID 0 - N povtora 0

Etot vtoroi potok , TID 3 - N povtora 1

Etot pervii potok , TID 2 - N povtora 1

Etot vtoroi potok , TID 3 - N povtora 2

Etot vtoroi potok , TID 3 - N povtora 3

Etot pervii potok , TID 2 - N povtora 2

Etot vtoroi potok , TID 3 - N povtora 4

Etot pervii potok , TID 2 - N povtora 3

Etot pervii potok , TID 2 - N povtora 4

#

2. Упражнения

2.1. Создайте несколько групп потоков с разными приоритетами и дисциплиной диспетчеризации таким образом, чтобы продемонстрировать последовательность их выполнения с помощью сообщений выдаваемых процессами и/или команд ОС.

2.2. Для перевода потоков в блокированное состояние используйте (например) обращения к внешним устройствам (клавиатуре) и функцию sleep(n).

2.3. Синхронизуйте работу двух потоков.

3. Содержание отчёта

  1. Номер, название и цель работы.

  2. Краткое описание способов организации дочерних потоков.

  3. Демонстрация работы приложения.

  4. Оформление письменного отчета по результатам выполнения работы.

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №18

Синхронизация потоков. Барьеры.

Цель работы – ознакомиться с последовательностью запуска потоков за барьером, а также возможностью (или невозможностью) синхронизации нескольких потоков, принадлежащих нескольким разным процессам.

1. Краткие теоретические сведения

1.1. Применение барьера

В случае синхронизации с барьером, мы ждем «встречи» определенного числа потоков у барьера. Когда заданное число потоков достигнуто, мы их все разблокируем (заметьте, что потоки при этом продолжат выполнять свою работу). Сначала барьер следует создать при помощи функции barrier_init0:

#include <sync.h>

Int barrier_init (barrier t *barrier,

const barrier attr t *attr,

int count) ;

Эта функция создает объект типа «барьер» по переданному ей адресу (указатель на барьер хранится в параметре barrier) и назначает ему атрибуты, которые определены в attr (мы будем использовать NULL, чтобы установить значения по умолчанию). Число потоков, которые должны вызывать функцию barrier_wait(), передается в параметре count.

После того как барьер создан, каждый из потоков должен будет вызвать функцию barrier_wait(), чтобы сообщить, что он отработал:

#include <sync.h>

int barrier_wait (barrier t *barrier) ;

После того как поток вызвал barrier_wait(), он будет блокирован до тех пор, пока число потоков, указанное первоначально в параметре count функции barrier_init(), не вызовет функцию barrier_wait (они также будут блокированы). После того как нужное число потоков выполнит вызов функции barrier_wait(), все эти потоки будут разблокированы «одновременно».