1.83K subscribers
3.3K photos
132 videos
15 files
3.58K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Блог*
#prog #rust А вот тут у нас хороший пример, как, казалось бы, нормальный код может спровоцировать UB. Здесь SPANS — глобальная переменная, вектор внутри RwLock. Чуть позже напишу, в чём проблема, а пока попредлагайте свои варианты
А проблема тут в том, что код для обеспечения корректности работы полагается на impl Drop for SpanGuard, который убирает последний вставленный span. О чём при написании unsafe-кода всегда надо помнить — так это о том, что, вообще говоря, нет гарантии, что деструкторы будут вызваны, поэтому полагаться на них для обеспечения memory safety нельзя. Так и тут: если SpanGuard утекает (а для это достаточно просто вызвать на нём std::mem::forget), то в глобальном векторе останется ссылка с насильно расширенным временем жизни. Если функция span была вызвана с ссылкой на локальные данные, то после выхода из этой функции в SPANS остаётся висячая ссылка, что прямо декларируется как undefined behaviour в Rust.
Forwarded from Маjко
Крафтовый борщ — это когда миллениалы изобрели советскую столовую
Блог* pinned «Кстати, тут такой вопрос, чат для канала нужен?»
Forwarded from Санечка Ъысь (Anna Weiss)
Блог* pinned «Го, я создал: @decltype_chat_ptr_t»
Forwarded from Andrew Demonov
У меня была нагрузка на 15к висящих лонг-пулинг коннектов (кооперативный майнинг-пул средней популярности). Когда логика была на потоках, примерно на 10к коннектах процесс жрал около 40 гигабайт памяти и просто зависал из-за постоянного свопинга. Ну и можно себе представить как охреневал планировщик тред-менеджер. Простое переписывание на асинхронщину снизило потребление памяти раз где-то в 15.
#prog #algo #article
Я раньше не понимал, как работает next_permutation. Теперь, кажется, понимаю.
Next lexicographical permutation algorithm
Forwarded from Антон
Не понял. Почему так происходит?
Forwarded from Jack
потому что порядок вызова аргументов не специфицирован, {} начинает конструктор объекта, создается лок, кидается исключение, а исключения в конструкторе объектов - это плохо, деструктор для не до конца собранного объекта не вызывается. в С++ есть специальный синтаксис для отлова ислючений типа: object(lock a, int& b) : try m_lock(a) catch ... {}, но я его забыл, да и не пользовался ни разу
Forwarded from Jack
A::A(const B& b) try : mB(b) 
{
// constructor stuff
}
catch (/* exception type */)
{
// handle the exception
}


вот
Forwarded from Bogdan
Ну выходит если бы лок создавался на строчку раньше и в локальнуб переменную, то все бы было ок?
Forwarded from Jack
da