Russian Qt Forum
Ноябрь 23, 2024, 00:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Функция sleep()  (Прочитано 6233 раз)
blood_shadow
Гость
« : Август 28, 2011, 18:38 »

Немного запутался в деталях...
Допустим есть два потока Thread_A и главный поток, метод run() потока Thread_A определен так:

Код
C++ (Qt)
void run()
{
   forever
   {
        // some operation
   }
}
 


если модифицировать так:
Код
C++ (Qt)
void run()
{
   forever
   {
        // some operation
        sleep(2);
   }
}
 

Вопрос -
задержка в выполнении потока Thread_A будет 2 сек. + задержка на выполнение самой ф-ции sleep(2); ?

Спасибо
Записан
blood_shadow
Гость
« Ответ #1 : Август 29, 2011, 15:55 »

В принципе разобрался помогла мне книга Джеффри Рихтера "Создание эффективных WIN32-приложений"
одно только осталось интересно при выполнении самой ф-ции sleep() поток прерывается?
Записан
brankovic
Гость
« Ответ #2 : Август 29, 2011, 16:11 »

одно только осталось интересно при выполнении самой ф-ции sleep() поток прерывается?

прерывается выполнение потока. Информация о потоке сохранятся и (примерно) через N секунд контекст потока снова активируется и поток продолжает работать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 29, 2011, 16:22 »

прерывается выполнение потока. Информация о потоке сохранятся и (примерно) через N секунд контекст потока снова активируется и поток продолжает работать.
Было бы неплохо узнать (в популярной форме) что то за "контекст" и что в него входит. Ну переключить стек, что еще? Смущает что адресное пр-во общее, откуда берутся (весьма существенные) затраты на усыпление/пробуждение нитки?

Спасибо
Записан
blood_shadow
Гость
« Ответ #4 : Август 29, 2011, 16:53 »

прерывается выполнение потока. Информация о потоке сохранятся и (примерно) через N секунд контекст потока снова активируется и поток продолжает работать.
Было бы неплохо узнать (в популярной форме) что то за "контекст" и что в него входит. Ну переключить стек, что еще?

Спасибо
короче в ней сохраняются значения регистров процессора для конкретного потока, сама структура
определена в WinNT.h:
Код:
typedef struct _CONTEXT
812 {
813     DWORD   ContextFlags;
814
815     /* These are selected by CONTEXT_DEBUG_REGISTERS */
816     DWORD   Dr0;
817     DWORD   Dr1;
818     DWORD   Dr2;
819     DWORD   Dr3;
820     DWORD   Dr6;
821     DWORD   Dr7;
822
823     /* These are selected by CONTEXT_FLOATING_POINT */
824     FLOATING_SAVE_AREA FloatSave;
825
826     /* These are selected by CONTEXT_SEGMENTS */
827     DWORD   SegGs;
828     DWORD   SegFs;
829     DWORD   SegEs;
830     DWORD   SegDs;
831
832     /* These are selected by CONTEXT_INTEGER */
833     DWORD   Edi;
834     DWORD   Esi;
835     DWORD   Ebx;
836     DWORD   Edx;
837     DWORD   Ecx;
838     DWORD   Eax;
839
840     /* These are selected by CONTEXT_CONTROL */
841     DWORD   Ebp;
842     DWORD   Eip;
843     DWORD   SegCs;
844     DWORD   EFlags;
845     DWORD   Esp;
846     DWORD   SegSs;
847
848     BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
849 } CONTEXT;
Записан
blood_shadow
Гость
« Ответ #5 : Август 29, 2011, 16:55 »

мне вот такое еще интересно -
потоки создаются в адресном пространстве процесса, возможно ли насоздавать столько потоков
что этого адресного пространства не хватит? и что тогда произойдет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 29, 2011, 17:29 »

короче в ней сохраняются значения регистров процессора для конкретного потока, сама структура
определена в WinNT.h:
Затраты на сохранение регистров ничтожно малы, с таким "переключение контекста" все бы летало. Но этого не происходит - попробуйте устроить "интенсивную конкуренцию" и N процессоров будут медленнее одного.

Так что давайте послушаем что скажет brankovic
Записан
blood_shadow
Гость
« Ответ #7 : Август 29, 2011, 17:37 »

короче в ней сохраняются значения регистров процессора для конкретного потока, сама структура
определена в WinNT.h:
Затраты на сохранение регистров ничтожно малы, с таким "переключение контекста" все бы летало.

Так что давайте послушаем что скажет brankovic
Вы имеете ввиду задержку 20 милисекунд на переключение потока?
Записан
BRE
Гость
« Ответ #8 : Август 29, 2011, 18:17 »

Было бы неплохо узнать (в популярной форме) что то за "контекст" и что в него входит. Ну переключить стек, что еще? Смущает что адресное пр-во общее, откуда берутся (весьма существенные) затраты на усыпление/пробуждение нитки?
В google: intel tss
Опять попробую предложить тебе непотребство... под названием книга... правда поправляет... Подмигивающий

Спасибо
Пожалуйста.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 29, 2011, 18:35 »

Вы имеете ввиду задержку 20 милисекунд на переключение потока?
Не знаю откуда взялась эта цифра. но это много. Пример: всего-навсего "потокобезопасный вектор" (или др контейнер), одни нитки пишут, др. читают. Себестоимость единичных записи/чтения куда меньше миллисекунды - значит все будет сожжено на блокировках.

Опять попробую предложить тебе непотребство... под названием книга... правда поправляет... Подмигивающий
Откуда такая уверенность что я совсем темный и книг не читаю? Улыбающийся
Если человек понимает вещь - он может объяснить ее "на пальцах". Пусть это объяснение не исчерпывающее, но оно интересно и полезно (понятно "что главное"). А "посылать на гугл" ума много не надо, так на любой вопрос можно ответить (вернее - отпихнуться)   Улыбающийся
Записан
BRE
Гость
« Ответ #10 : Август 29, 2011, 18:44 »

Ну если ты воспользуешься поиском, то скорее всего найдешь мое сообщение на форуме, где я на пальцах пытался рассказать про TSS и процесс переключения задач. Подмигивающий
Тогда у тебя эта тема не вызвала интереса, да?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.316 секунд. Запросов: 22.