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

Разговор пошел по кругу. если вам повезло никогда не ловить

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

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

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

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

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

++++++++++++++

и давайте таки вынесем эту дискуссию из DS-чата. Если кто желает ее продолжить в стороннем канале, поделитесь ссылкой.

1 ответов

19 просмотров

Плюс в том, что код выглядит абсолютно линейно как буд-то это обычный синхронный код. Дополнительный плюс еще по сравнению с питоном в том, что все не нужны никакие специальные библиотеки. Весь код работает с IO асинхронно в любом случае и из коробоки. P.S. По поводу организации доступа к памяти - можно добиться ровно того же эффекта, что и с io loop завернув код в актор, который серелизует обращение к его внутреннему стейту. Все, нет проблемы.

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

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

а через 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
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта