Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:

printf("end-of-file on %s\n", fptr->f_name);

Close(fd);

Pthread_mutex_lock(&ndone_mutex);

fptr->f_flags = F_DONE; /* сбрасывает флаг F_READING */

ndone++;

Pthread_cond_signal(&ndone_cond);

Pthread_mutex_unlock(&ndone_mutex);

return(fptr); /*
завершение выполнения потока */

}

Большинство изменений касается главного цикла, представленного в листинге 26.8. Новая версия показана в листинге 26.13.

Листинг 26.13. Основной рабочий цикл функции main

//threads/web03.c

43 while (nlefttoread > 0) {

44 while (nconn < maxnconn && nlefttoconn > 0) {

45 /* находим файл для считывания */

46 for (i = 0; i < nfiles; i++)

47 if (file[i].f_flags == 0)

48 break;

49 if (i == nfiles)

50 err_quit("nlefttoconn = %d but nothing found", nlefttoconn);

51 file[i].f_flags = F_CONNECTING;

52 Pthread_create(&tid, NULL, &do_get_read, &file[i]);

53 file[i].f_tid = tid;

54 nconn++;

55 nlefttoconn--;

56 }

57 /* Ждем завершения выполнения одного из потоков */

58 Pthread_mutex_lock(&ndone_mutex);

59 while (ndone == 0)

60 Pthread_cond_wait(&ndone_cond, &ndone_mutex);

61 for (i = 0; i < nfiles; i++) {

62 if (file[i].f_flags & F_DONE) {

63 Pthread_join(file[i].f_tid, (void**)&fptr);

64 if (&file[i] != fptr)

65 err_quit("file[i] != fptr");

66 fptr->f_flags = F_JOINED; /* clears F_DONE */

67 ndone--;

68 nconn--;

69 nlefttoread--;

70 printf("thread %d for %s done\n", fptr->f_tid, fptr->f_name);

71 }

72 }

73 Pthread_mutex_unlock(&ndone_mutex);

74 }

75 exit(0);

76 }

По
возможности создаем новый поток

44-56
Эта часть кода не изменилась.

Ждем завершения выполнения потока

57-60
Мы ждем завершения выполнения потоков, отслеживая, когда значение
ndone
станет равно нулю. Как сказано в разделе 26.8, эта проверка должна быть проведена перед тем, как взаимное исключение будет блокировано, а переход потока в состояние ожидания осуществляется функцией
pthread_cond_wait
.

Обработка завершенного потока

61-73
Когда выполнение потока завершилось, мы перебираем все структуры
file
, отыскивая соответствующий поток, вызываем
pthread_join
, а затем устанавливаем новый флаг
F_JOINED
.

В табл. 16.1 показано, сколько времени требует выполнение этой версии веб-клиента, а также версии, использующей неблокируемую функцию

connect
.

26.10. Резюме

Создание нового потока обычно требует меньше времени, чем порождение нового процесса с помощью функции

fork
. Одно это уже является большим преимуществом использования потоков на активно работающих сетевых серверах. Многопоточное программирование, однако, представляет собой отдельную технологию, требующую большей аккуратности при использовании.

Все потоки одного процесса совместно используют глобальные переменные и дескрипторы, тем самым эта информация становится доступной всем потокам процесса. Но совместное использование информации вносит проблемы, связанные с синхронизацией доступа к разделяемым переменным, и поэтому нам следует использовать примитивы синхронизации технологии Pthreads — взаимные исключения и условные переменные. Синхронизация доступа к совместно используемым данным — необходимое условие почти для любого приложения, работающего с потоками.

При разработке функций, которые могут быть вызваны таким приложением, нужно учитывать требование безопасности в многопоточной среде. Это требование выполнимо при использовании собственных данных потоков (thread-specific data), пример которых мы показали при рассмотрении функции

readline
в этой главе.

К модели потоков мы вернемся в главе 30, где сервер при запуске создает пул потоков. Для обслуживания очередного клиентского запроса используется любой свободный поток.

Поделиться:
Популярные книги

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Темный Охотник

Розальев Андрей
1. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Охотник

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Отборная бабушка

Мягкова Нинель
Фантастика:
фэнтези
юмористическая фантастика
7.74
рейтинг книги
Отборная бабушка

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Купидон с топором

Юнина Наталья
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Купидон с топором

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...