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

Текст программы. #include <sys/neutrino.h>



Читайте также:
  1. AvrStudio в режиме отладки программы
  2. Cочинение на ГИА 2013 года по тексту 4
  3. Cочинение по тексту Куприна
  4. G. Перепишите и переведите текст.
  5. G. Перепишите и переведите текст.
  6. I. Прочитайте и переведите текст.
  7. I. Прочтите и переведите текст.

#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);

}

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

 

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

Как упоминалось ранее, с функцией pthreadJoin() рабочие потоки для синхронизации главного потока с ними должны умереть. В случае же с барьером потоки живут и чувствуют себя вполне хорошо. Фактически, отработав, они просто разблокируются по функции barrier_wait(). Тонкость здесь в том, что вы обязаны предусмотреть, что эти потоки должны делать дальше! В нашем примере с графикой мы не дали им никакого задания для них — просто потому что мы так придумали алгоритм. В реальной жизни вы могли бы захотеть, например, продолжить вычисления.

 

2.5.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.6 Лабораторная работа №6 «Условные переменные»

2.6.1 Теоретические сведения

 


Дата добавления: 2015-07-11; просмотров: 169 | Нарушение авторских прав






mybiblioteka.su - 2015-2024 год. (0.006 сек.)