Есть ли разница между использованием функций WindowsAPI Sleep() и WaitForSingleObject() в плане эффективности предоставления оставшейся части кванта времени другим потокам?
Предположим, мы хотим приостановить текущий поток на малый промежуток времени (например, 50-100 мс), и, как перфекционисты, желаем, чтобы другим потокам досталась максимально возможная часть этого процессорного времени, включая остаток текущего кванта (минимизировать накладные расходы, присущие реализации).
Точность реализации временной задержки не имеет значения
Вариант 1: Sleep(xx)
Вариант 2: WaitForSingleObject(h,..,..,xx) — в качестве хендла указываем хэндл самого потока, соответственно выход по таймауту
Дед Нечипор, если поток ждет (ничего не делает), то, наверное, у него в любом случае будет низкий приоритет. Тут, скорее, вопрос в дизайне: если поток не ждет определенного события, то чего он, собственно, ждет? Может, когда истечет таймер будет не лучший момент для исполнения с точки зрения загруженности процессора. Может, лучше изначально исполняться с заведомо низким приоритетом или подождать пока более важные «разрешат»?
Value, тут ситуация такая: есть потоки-поставщики маркет-данных и потоки-потребители. Соединены lockless очередями. И у тех, и у других предполагается наличие постоянной работы по определению, поэтому вклинивать в процесс отправки данных сигнализацию с помощью TEvent считаю неоправданной в моем случае, т.к. добавляются накладные расходы на синхронизацию.
Предполагаю, что время «простоя» (промежуток времени, когда очередь пустая или промежутки между доставкой датафидом данных потоку-поставщику для постановки в очередь) можно ожидать слишком малой величиной и сами простои не таким уж и частым событием, чтобы проектировать это взаимодействие на событийной модели через объекты синхронизации.
Решил пойти таким путем — если вдруг так уж случилось, что выдался момент затишья у потока, то нечего впустую молотить процессорное время и дать потоку заснуть на малый квант времени (50-100 мс), эдакая подсказка планировщику, что можно подкормить временем другие потоки, может кому нужнее. С миру по нитке — гляди, и еще на один поток-робот время наскребется на бюджетном процессоре. А пакет датафида, который накопится за это время, будет обработан позже — задержка-то некритична.
bstone, а пониженный приоритет у потока остается после возврата из спячки, или возвращается к обычному состоянию, предшествующему засыпанию? Т.е. если все потоки имели равный приоритет, останется ли это так же после того, как один из них (или каждый в свое время) вызовет и вернется из Sleep()?
Дед Нечипор, Sleep() понижает приоритет потока до базового и так его и оставляет. Т.е. если менялся динамический приоритет потока для priority boost, то его после спячки надо будет опять поднимать по необходимости.
Это все не работает на малоядерных процессорах под виндовс, типичный слип будет 2-6 миллисекунд при переключении контекста процесса. На него и можно закладываться.
Heinrich von Baur, когда то давно считал. Могу в цифрах ошибаться, но каждые +10 рублей к цене выкупа — это ~3 млрд затрат. Вы считаете, что сейчас государство будет такими суммами разбрасываться? ...
ABC4045, и что, что она падает? Ну она и растет иногда, в чем предсказание? Упадет до 25, потом вырастет снова. Насчет сведений, если бы вы ими располагали, вы бы не на форуме советы раздавали бесп...
Золото — больше не защитный актив? На фоне общемировых распродаж на финансовых рынках цены на золото также упали. За три дня драгоценный металл потерял с максимумов почти 6%. Разбираемся, стоит ли сей...
Maximun, У Борца очень большие долги, проблемы с новыми заказами из-за неопределенности, нет ясности, будут ли экспортные поставки в будущем, государство Борец национализировало, но так за 10дней в...
Альфа-Турнир: 130 млн рублей для инвесторов На рынках невесело, но любой кризис даёт хорошие возможности. Особенно если можно получить дополнительную прибыль — 130 000 000 рублей. Это призовой фонд вт...
Предположим, мы хотим приостановить текущий поток на малый промежуток времени (например, 50-100 мс), и, как перфекционисты, желаем, чтобы другим потокам досталась максимально возможная часть этого процессорного времени, включая остаток текущего кванта (минимизировать накладные расходы, присущие реализации).
Точность реализации временной задержки не имеет значения
Вариант 1: Sleep(xx)
Вариант 2: WaitForSingleObject(h,..,..,xx) — в качестве хендла указываем хэндл самого потока, соответственно выход по таймауту
Предполагаю, что время «простоя» (промежуток времени, когда очередь пустая или промежутки между доставкой датафидом данных потоку-поставщику для постановки в очередь) можно ожидать слишком малой величиной и сами простои не таким уж и частым событием, чтобы проектировать это взаимодействие на событийной модели через объекты синхронизации.
Решил пойти таким путем — если вдруг так уж случилось, что выдался момент затишья у потока, то нечего впустую молотить процессорное время и дать потоку заснуть на малый квант времени (50-100 мс), эдакая подсказка планировщику, что можно подкормить временем другие потоки, может кому нужнее. С миру по нитке — гляди, и еще на один поток-робот время наскребется на бюджетном процессоре. А пакет датафида, который накопится за это время, будет обработан позже — задержка-то некритична.