Семафор - это примитив синхронизации потоков, который позволяет войти в заданный участок кода не более чем n потокам (это определение дал выдающийся ученый  Эдсгер Дейкстра).

Обычно семафор нужен для того, чтобы ограничить доступ к некоторому ресурсу, заданным количеством потоков приложения (ресурсом может быть например внешнее устройство, или некий сетевой ресурс).

В некоторых случаях, может иметь значение порядок доступа потоков к ресурсу. Стандартный класс Semaphore никак не гарантирует порядок, в котором заблокированные потоки будут получать доступ к ресурсу (входить в заданный участок).

Например, за каждым потоком может скрываться пользователь, который ожидает доступа к ресурсу. Если использовать стандартный класс Semaphore, то доступ к освобождающемуся ресурсу будет получать случайный пользователь, не зависимо от того как давно он ожидает.

Для решения этой задачи, мною был написан класс FifoSemaphore, который реализует политику FIFO (английское First In First Out - первым пришел, первым ушел) по отношению к ожидающим потокам - поток который вызвал функцию Wait первым, должен получить доступ к ресурсу первым. При необходимости, его можно легко модифицировать так, чтобы он работал по принципу LIFO (Last In First Out).

Краткое описание класса

Интерфейс класса аналогичен стандартному классу, за исключением одного нюанса - он не наследует стандартный класс WaitHandle, и соответственно не реализует его свойства и методы (которые специфичны для Windows). Как следствие этот класс не получится использовать в вызове WaitAny

Конструкторы
FifoSemaphore()
 Создает объект.

FifoSemaphore(int _InitialCount)
 Создает объект и инициализирует начальное значение счетчика ресурсов - N;

int Release(int _ReleaseCount)
 Выходит из семафора заданное количество раз (освобождает заданное количество ресурсов), возвращает предыдущее значение счетчика ресурсов;

int Release()
 Выходит из семафора 1 раз, возвращает предыдущее значение счетчика ресурсов;

bool Wait(int _MillisecondsTimeout)
 Входит в семафор. Ожидает освобождения ресурса заданное время в миллисекундах. Если ресурс не был освобожден в указанный период времение, возвращает значение false, иначе - true.

void Close()
 Закрывает семафор и освобождает ресурсы. После этого вызова использовать семафор более не допустимо.

P.S.

Создание примитивов синхронизации иногда кажется простым, но в реальности возможны нетривиальные ситуации которые довольно сложно предвидеть.
Вполне допускаю, что в данном коде тоже есть ошибки, буду очень рад, если на них укажете.

Загрузить проект с реализацией и тестом: FifoSemaphore.zip (7,85 kb)


Какую домашнюю страницу можно задать, чтобы оптимально организовать свою работу? 

Многие ставят себе домашней страницей поисковую форму Гугла или Яндекса (mail.ru, rambler.ru и т.д.). Более продвинутые пользователи предпочитают создавать собственную страницу, для этого есть множество средств, начиная от Google Personal, до блогов или собственных сайтов.

Лично я использую в качестве домашней страницы - html файл, который находится на самом компьютере (и на домашнем и на рабочем).

Моя домашняя страница - кликните чтобы открыть

В результате - домашняя страница загружается очень быстро, ее можно легко отредактировать (конечно для того кто знает HTML). Под рукой все наиболее часто используемые ресурсы. Понятно, что тогда нет никакой серверной обработки, но есть клиентский скрипт, в котором тоже можно много чего сделать.

У меня этот home page указан во всех четырех браузерах, которые приходится использовать по работе. Это удобно еще тем, что не привязываешься собственно к меню, или избранным/ссылкам каждого конкретного браузера.

Небольшая подсказка - если вы захотите использовать этот файл как home-page, при открытии его непосредственно с локального диска Internet Explorer выдает предупреждение, что файл содержит скрипт и может быть небезопасен. При этом если этот же файл открывается по сети, либо через интернет, таких предупреждений нет (при настройках по умолчанию). Для того чтобы предупреждение не выдавалось, можно например открывать его через URL \\pc-name\c$\HomePage\default.html, где pc-name - имя компьютера. Вместо c$, доступного администратору, можно использовать любую расшаренную папку, тогда предупреждения тоже не будет.

Загрузить страницу с иконками: my-homepage.zip (17,11 kb)


maqdev.com

сообщения с ограниченным временем жизни