Что такое функционирование в «Реальном масштабе времени»
Download 1.86 Mb. Pdf ko'rish
|
Луканов А.С. Системы реального времени 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling