Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WaitForSingleObject внутри

11K
05 декабря 2008 года
Babandr
76 / / 05.05.2008
Никто не интересовался - как устроена внутри ф-ция WaitForSingleObject? как ей удается не загружать процессор?
...и еще любопытно: как выглядит зависимость быстродействия программы от количества задействованных в ней event'ов?
261
05 декабря 2008 года
ahilles
1.5K / / 03.11.2005
я не видел исходников, точно не знаю, поэтому могу ошибаться.
функция WaitForSingleObject переводит статус потока, который её вызвал, в статус "ожидание", заполняет какое-то поле, в котором хранится хендл, котолрый он ожидает. Когда происходит изменение состояния объекта ожидания, заодно ищутся все ожидающие потоки, которые ждут этот объект и их состояние переводится в состояние "готов" (или как оно там называется). А планировщик потоков дальше сам разберётся. Да, про таймауты забыл. При каждом "тике" таймера, проверяются все ожидающие потоки, у которых указан таймаут (не INFINITY), если у кого-то время истекло, то его состояние переводится в "готов".

P.S. если я не ошибаюсь функция WaitForSingleObject, это оболочка вокруг функции WaitForMultipleObjects
9.3K
05 декабря 2008 года
iridum
175 / / 26.08.2007
Насчёт скорости программ относительно количества ивентов. Мне кажется что опять таки это общая скорость программы ложится на WaitForMultipleobjects, который приостанавливает поток(поэтому процессор и не загружается, наоборот разгружается) до тех пор пока ивент не просигналит, но смотрите какая интересная вещь наблюдается. Привожу пример в коде C++ Builder, потому как немного лень клепать потоки. В Builder есть ф-я Sleep, которая, как я понимаю тоже работает через WaitForMultipleobjects, также приостанавливая поток и не нагружая процессор. Есть следующий код:

Код:
char *b;
   AnsiString a = "|||";

   //определение скорости выполнения участка 1
   int deltaTime = timeGetTime();
   for(int u= 0;u<15000;u++)
   {
    b = a.c_str();
    }
   deltaTime = timeGetTime()-deltaTime;

   Edit2->Text = (AnsiString)deltaTime;

   //предполагаемый WaitForMultipleobjects, хотя стоит проверить
   Sleep(1);

   //определение скорости выполнения участка 2
   deltaTime = timeGetTime();
   for(int u= 0;u<15000;u++)
   {
    b = a.c_str();
   }
   deltaTime = timeGetTime()-deltaTime;

   Edit3->Text = (AnsiString)deltaTime;



Так вот - участок с номером 1 по результатам будет выполнятся медленнее чем участок с номером 2. Мои мысли такие, что виндосв после продолжения потока (после паузы) временно даёт ему больший приоритет. Посути при использовании ивентов возможно достич еще большей скорости, чем использовать другую реализацию программы.
Если я ошибаюсь поправте, мне самому интересно, определённо кто-то знает подробно.
261
05 декабря 2008 года
ahilles
1.5K / / 03.11.2005
да, планировщик в некоторых случаях временно повышает приоритет потоков вышедших из ожидания. В этой книге всё подробно описано
562
07 декабря 2008 года
tarekon
175 / / 19.08.2003
Скорее тут не повышение приоритета, а попадание в начало временного слайса.

Функция Sleep безусловно заканчивает текущий временной отрезок, выданный потоку. Вызов Sleep( 0 ) фактически заставляет поток "пропустить" очередь к процессору, но только один цикл.

Возможно, получается так, что первый цикл разрывается между двумя слайсами, а после вызова Sleep( 1 ) поток автоматически попадает в самое начало нового и цикл успевает выполниться целиком до переключения на другой поток.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог