169 похожих чатов

Ну какой смысл в разблокировании ? Пусть себе висит и

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

22 ответов

4 просмотра

Я столкнулся с этой проблемой при реализации сервера транзита данных, два компьютера устанавливают соединение через этот сервер, передают информацию друг другу, но сервер заранее не знает, кто кому отправит информацию. На сервере 2 потока, каждый из которых ожидает на сокете пакет, который нужно сразу же передать в другой сокет. Например, поток 1 принял пакет от компьютера 1, размещает его в очереди на отправку для потока 2. Но поток 2 в это время ожидает данные из сокета и его никак нельзя пнуть, чтобы он прервал чтение сокета и проверил очередь пакетов для отправки. Единственный способ - выставлять таймаут на чтение сокета. Если таймаут маленький, например 10мс, то реакция быстрая, но нагрузка на процессор жуткая. Если таймаут большой, например 1000, то реакция очень медленная. Если бы имелась возможность досрочного прервать операцию чтения сокета, то была бы обеспечена моментальная реакция при любом таймауте.

Дмитрий Логинов
Я столкнулся с этой проблемой при реализации серве...

Вы что-то делаете неправильно. Проверить наличие данных в сокете ничего не стоит и занимает 0 мс. Можно поспать до следующей проверки 0 мс, и у процессора будет 0% нагрузки.

Sergey Bodrov
Вы что-то делаете неправильно. Проверить наличие д...

Вы предлагаете проверять сокет через каждые 0мс и при этом не будет никакой нагрузки?

Дмитрий Логинов
Вы предлагаете проверять сокет через каждые 0мс и ...

Да, именно так. Достаточно просто спросить у сокета, есть ли входящие данные, это делается командой select

Sergey Bodrov
Да, именно так. Достаточно просто спросить у сокет...

Если проверять каждые 0 мс я загружу одно ядро процессора на 100%. Так не пойдёт.

Sergey Bodrov
Цикл со sleep(0) и select() не сложно проверить.

Зачем? Не вижу в этом смысла. Либо бы ждем на сокете либо грузим проц, третьего варианта не будет.

Дмитрий Логинов
Зачем? Не вижу в этом смысла. Либо бы ждем на соке...

Ваш вариант чтения с ожиданием грузит проц. Вы решили, что мой вариант будет работать точно так же? =) Впрочем, если вы так уверены в результате без эксперимента, то вам помощь не нужна.

Sergey Bodrov
Цикл со sleep(0) и select() не сложно проверить.

А зачем в вашем цикле Sleep(0)? Он какую роль играет?

Дмитрий Логинов
А зачем в вашем цикле Sleep(0)? Он какую роль игра...

Контекст переключает. Если в слип передать 0, он оставшуюся часть интервала своего отдает другому потоку с таким же приоритетом

Александр В
Контекст переключает. Если в слип передать 0, он о...

Но если есть незанятые ядра процессора, то sleep(0) тупо вернет управление обратно, т.е. контекст даже не переключится.

Дмитрий Логинов
Но если есть незанятые ядра процессора, то sleep(0...

Sleep в любом случае вызовет ZwDelayExecution который произведет отдачу неиспользуемого кванта нити

Александр (Rouse_) Багель
Sleep в любом случае вызовет ZwDelayExecution кото...

Это может быть. Но это не обязательно будет переключение контекста. Просто отсчет кванта начнётся заново.

Для процессора это не разгрузка. С какой стати?

Александр (Rouse_) Багель
Это что-то новое, где ты такое вычитал? :))))

Сделай тест из 10000 вызовов sleep(0) в цикле и замерь в микросекундах. Операция переключения контекста сильно повлияет на общее время.

Дмитрий Логинов
Сделай тест из 10000 вызовов sleep(0) в цикле и за...

Ты кажется не понимаешь как это работает в общем и делаешь не верные выводы :) Для начала начни с вот этого, там про KWAIT_REASON и про прочее https://wasm.in/blogs/planirovschik-potoki-i-processy.517/

Александр (Rouse_) Багель
Ты кажется не понимаешь как это работает в общем и...

Я как раз в общем понимаю как это работает. Но не разбирался с каждой деталью. Ты видимо ориентируешься в деталях. Это очень круто.

Дмитрий Логинов
Я как раз в общем понимаю как это работает. Но не ...

Выяснили кстати чего у Акшенов в DT Enabled слетает. Там не заглушен апдейт в дизайнтайме, а т.к. в дизайнтайме у акшенов нет отработчиков они и дисейблятся. Причем самое интересное что это только с MainMenu так глючит.

Александр (Rouse_) Багель
Ты кажется не понимаешь как это работает в общем и...

Сделал тест с циклом из 10000 вызовов. Общее время составило 1.8 миллисекунд. Это совершенно не похоже на переключение контекста. Если бы оно реально было, то время было бы никак не меньше 10 миллисекунд, а скорее 100 миллисекунд. Тут не нужно детально вникать в реализацию каждой функции, достаточно сделать простейший тест и все на свои места встанет.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта