Автор работы: Пользователь скрыл имя, 17 Января 2012 в 21:30, лабораторная работа
Реализовать последовательно-параллельный запуск нитей в операционной системе Linux (см. задание I) с использованием средств синхронизации. В графе выделяются три группы нитей. Часть нитей никак не синхронизирована. Часть синхронизирована мьютексом (захватывает мьютекс на время выполнения). Часть – семафорами (передает управление другой нити после каждой итерации).
pthread_t th_a, th_b, th_c, th_d, th_e, th_f, th_g, th_i,
th_k, th_m, th_n;
void * retval; // возвращаемое
значение нити
// создать мьютекс
retcode = pthread_mutex_init(
&mt, // дескриптор мьютекса
NULL); // атрибуты не используем
// создать семафоры
retcode = sem_init(
&sm_g, // дескриптор семафора
0, // могут использовать разные нити
0); // начальное значение 0
retcode = sem_init(&sm_b, 0, 0);
retcode = sem_init(&sm_c, 0, 0);
// семафор d начальное значение 1
retcode = sem_init(&sm_d,
0, 1);
//retcode =
pthread_create(&th_e, NULL, process1, (void *) "e");
// создать нить а . Не синхронизирована
retcode = pthread_create(
&th_a, // дескриптор нити
NULL, // default attributes атрибуты не используем
process1, // функции нити
(void *)"a"); // параметр для ф-ции нити (имя нити)
// ждем завершения нити а
retcode = pthread_join(
th_a, // дескриптор нити
&retval); // возвращаемое значение
нити
// создать нить g b c d. Синронизация семафорами
retcode = pthread_create(&th_g, NULL, process3, (void *) "g");
retcode = pthread_create(&th_b, NULL, process3, (void *) "b");
retcode = pthread_create(&th_c, NULL, process3, (void *) "c");
retcode = pthread_create(&th_d, NULL, process3, (void *) "d");
// ждем завершения нити b
retcode = pthread_join(th_b, &retval);
// создать нить e. Не синхронизирована
retcode = pthread_create(&th_e, NULL, process1, (void *) "e");
// ждем завершения нити e c
retcode = pthread_join(th_e, &retval);
retcode = pthread_join(th_c, &retval);
// создать нить i f. Синхронизация мьютексом
retcode = pthread_create(&th_i, NULL, process2, (void *) "i");
retcode = pthread_create(&th_f, NULL, process2, (void *) "f");
// ждем завершения нити f d
retcode = pthread_join(th_f, &retval);
retcode = pthread_join(th_d, &retval);
// создать нить k m . Синхронизация мьютексом
retcode = pthread_create(&th_k, NULL, process2, (void *) "k");
retcode = pthread_create(&th_m, NULL, process2, (void *) "m");
// ждем завершения нити g i k
retcode = pthread_join(th_g, &retval);
retcode = pthread_join(th_i, &retval);
retcode = pthread_join(th_k, &retval);
// создать нить n Не синхронизирована
retcode = pthread_create(&th_n, NULL, process1, (void *) "n");
// ждем завершения нити n m
retcode = pthread_join(th_n, &retval);
retcode = pthread_join(th_m,
&retval);
// убрать мьютекс
retcode = pthread_mutex_destroy(&mt);
// убрать семафоры
retcode = sem_destroy (&sm_g);
retcode = sem_destroy (&sm_b);
retcode = sem_destroy (&sm_c);
retcode = sem_destroy (&sm_d);
return 0;
}
// ------------------------------
Выводы
В
ходе выполнения лабораторной работы
были изучены функции для работы
с нитями, мьютексами и семафорами
в операционной системе Linux, составлена
и отлажена программа на языке Си. Нити
запускаются согласно графу выполнения.
Программа работает корректно.
Информация о работе Последовательно-параллельный запуск нитей в операционной системе Linux