Ключевые слова:timeout, connect, time, java, (найти похожие документы)
Date: Fri, 11 Oct 2002 22:17:30 +0600
From: Ramazan Ja-Far <[email protected]>
Newsgroups: ftn.ru.unix.prog
Subject: Использование пересекающихся таймеров в программе.
AP>Я имел ввиду вот что. Скажем, пишу я два куска кода. В одном таймер
AP>используется, чтобы организовать timeout на connect, а в другом на
AP>целую последовательность операций (ну, например, на вытаскивание файла
AP>по FTP). По отдельности оба куска работают замечательно. Hо если я
AP>захочу скрестить их вместе (например, использовать "умный" connect
AP>из первого куска кода в качестве connect'а для FTP-библиотеки), то
AP>они немедленно подерутся за таймер.
Эта проблема решается написанием умного таймера.
К примеру, таймер имеет список отрезков времени и
соответствующих дескрипторов файлов, через которые
он будет сигналить. Плюс мутекс, контролирующий
доступ к списку и 1 dedicated waiting thread.
Допустим, есть два потока (threads). 1-й просит
таймер просигналить через 20000 миллисекунд.
2-й - через 100.
В список складываем два задания - ждать 100 мсек
и сигналить 2-му потоку, а потом ждать 19900мсек
и сигналить 1-му в указанный дескриптор.
Dedicated thread или ничего не делает, или ждёт
с таймаутом (таймаут берётся из первого задания
в списке) на каком-нибудь объекте. Этот объект
сигналят потоки, когда нужно изменять задание в
начале списка или отменять задания. Проснувшись,
dedicated timer thread захочет узнать, сколько
он спал, если конечно его разбудили, а не
закончился таймаут, - и скорректировать время для
следующих заданий.
В списке можно держать время в виде delta от
предыдущего задания, или абсолютные значения -
на вкус реализатора (implementor).
В общем, я подобное писал на Java. Там можно ждать
на чём угодно - java.lang.Object.wait(long msec),
java.lang.Object.notify(),
java.lang.Object.notifyAll()
:-)
Думаю, аборигенам RU.UNIX.PROG не составит труда
воплотить идею...
P.S. all abovementioned should be considered as
general idea, having been implemented by author
in Java, but never in C/POSIX.