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

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

#include <stdio.h>

#include <time.h>

#include <sync.h>

#include <sys/neutrino.h>

barrier_t barrier;

//int data_ready = 0;

//int inf = 0;

//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

//pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;

void *thread1 (void * not_used)

{

time_t now;

char buf[27];

time(&now);

printf("Potok 1, vremia starta %s \n", ctime_r(&now,buf));

sleep(3);

barrier_wait(&barrier);

time(&now);

printf("barier v potoke 1 , vremia srabativania %s \n", ctime_r(&now,buf));

}

void *thread2 (void * not_used)

{

time_t now;

char buf[27];

time(&now);

printf("Potok 2, vremia starta %s \n", ctime_r(&now,buf));

sleep(6);

barrier_wait(&barrier);

time(&now);

printf("barier v potoke 2 , vremia srabativania %s \n", ctime_r(&now,buf));

}

main()

{

time_t now;

char buf[27];

barrier_init(&barrier, NULL, 3);

printf("Start \n");

pthread_create(NULL,NULL, thread1 ,NULL);

pthread_create(NULL,NULL, thread2 ,NULL);

time(&now);

printf(" Main(): oshidanie y bariera, vremia %s \n", ctime_r(&now,buf));

barrier_wait(&barrier);

time(&now);

printf("barier v main() , vremia srabativania %s \n", ctime_r(&now,buf));

sleep(5);

}

1.3. Последовательность действий

Основной поток создал объект типа «барьер» и инициализировал его значением счетчика, равным числу потоков (включая себя!), которые должны «встретиться» у барьера, прежде чем он «прорвется». В нашем примере этот индекс был равен 3 – один для потока main(), один для потока thread1 () и один для потока thread2(). Затем стартуют потоки thread 1() и thread2()). Для примера мы просто временно «усыпили» потоки, указав в них sleep (20) и sleep (40), чтобы имитировать вычисления. Для осуществления синхронизации основной поток (таin()) просто блокирует сам себя на барьере, зная, что барьер будет разблокирован только после того, как рабочие потоки аналогично присоединятся к нему.

Тонкость здесь в том, что вы обязаны предусмотреть, что эти потоки должны делать дальше! В реальной жизни вы могли бы захотеть, например, продолжить вычисления.

1.4. Результаты

# root/a.out

Start

Potok 1, vremia starta Tue Oct 21 00:29:01 2003

Potok 2, vremia starta Tue Oct 21 00:29:01 2003

Main(): oshidanie y bariera, vremia Tue Oct 21 00:29:01 2003

barier v potoke 2 , vremia srabativania Tue Oct 21 00:29:07 2003

barier v main() , vremia srabativania Tue Oct 21 00:29:07 2003

barier v potoke 1 , vremia srabativania Tue Oct 21 00:29:07 2003

#/**

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

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

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

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

  2. Краткое описание применения барьера и последовательности запуска потоков за барьером.

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

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

186