Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: blood_shadow от Август 28, 2011, 18:38



Название: Функция sleep()
Отправлено: 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); ?

Спасибо


Название: Re: Функция sleep()
Отправлено: blood_shadow от Август 29, 2011, 15:55
В принципе разобрался помогла мне книга Джеффри Рихтера "Создание эффективных WIN32-приложений"
одно только осталось интересно при выполнении самой ф-ции sleep() поток прерывается?


Название: Re: Функция sleep()
Отправлено: brankovic от Август 29, 2011, 16:11
одно только осталось интересно при выполнении самой ф-ции sleep() поток прерывается?

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


Название: Re: Функция sleep()
Отправлено: Igors от Август 29, 2011, 16:22
прерывается выполнение потока. Информация о потоке сохранятся и (примерно) через N секунд контекст потока снова активируется и поток продолжает работать.
Было бы неплохо узнать (в популярной форме) что то за "контекст" и что в него входит. Ну переключить стек, что еще? Смущает что адресное пр-во общее, откуда берутся (весьма существенные) затраты на усыпление/пробуждение нитки?

Спасибо


Название: Re: Функция sleep()
Отправлено: blood_shadow от Август 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;


Название: Re: Функция sleep()
Отправлено: blood_shadow от Август 29, 2011, 16:55
мне вот такое еще интересно -
потоки создаются в адресном пространстве процесса, возможно ли насоздавать столько потоков
что этого адресного пространства не хватит? и что тогда произойдет?


Название: Re: Функция sleep()
Отправлено: Igors от Август 29, 2011, 17:29
короче в ней сохраняются значения регистров процессора для конкретного потока, сама структура
определена в WinNT.h:
Затраты на сохранение регистров ничтожно малы, с таким "переключение контекста" все бы летало. Но этого не происходит - попробуйте устроить "интенсивную конкуренцию" и N процессоров будут медленнее одного.

Так что давайте послушаем что скажет brankovic


Название: Re: Функция sleep()
Отправлено: blood_shadow от Август 29, 2011, 17:37
короче в ней сохраняются значения регистров процессора для конкретного потока, сама структура
определена в WinNT.h:
Затраты на сохранение регистров ничтожно малы, с таким "переключение контекста" все бы летало.

Так что давайте послушаем что скажет brankovic
Вы имеете ввиду задержку 20 милисекунд на переключение потока?


Название: Re: Функция sleep()
Отправлено: BRE от Август 29, 2011, 18:17
Было бы неплохо узнать (в популярной форме) что то за "контекст" и что в него входит. Ну переключить стек, что еще? Смущает что адресное пр-во общее, откуда берутся (весьма существенные) затраты на усыпление/пробуждение нитки?
В google: intel tss
Опять попробую предложить тебе непотребство... под названием книга... правда поправляет... ;)

Спасибо
Пожалуйста.


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

Опять попробую предложить тебе непотребство... под названием книга... правда поправляет... ;)
Откуда такая уверенность что я совсем темный и книг не читаю? :)
Если человек понимает вещь - он может объяснить ее "на пальцах". Пусть это объяснение не исчерпывающее, но оно интересно и полезно (понятно "что главное"). А "посылать на гугл" ума много не надо, так на любой вопрос можно ответить (вернее - отпихнуться)   :)


Название: Re: Функция sleep()
Отправлено: BRE от Август 29, 2011, 18:44
Ну если ты воспользуешься поиском, то скорее всего найдешь мое сообщение на форуме, где я на пальцах пытался рассказать про TSS и процесс переключения задач. ;)
Тогда у тебя эта тема не вызвала интереса, да?