Что такое функционирование в «Реальном масштабе времени»


Download 1.86 Mb.
Pdf ko'rish
bet67/72
Sana19.04.2023
Hajmi1.86 Mb.
#1362511
TuriУчебное пособие
1   ...   64   65   66   67   68   69   70   71   72
Bog'liq
Луканов А.С. Системы реального времени 2020

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

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



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

 
 
 


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

Download 1.86 Mb.

Do'stlaringiz bilan baham:
1   ...   64   65   66   67   68   69   70   71   72




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling