Cuno
Почему странный? Допустим я thread-safe контейнер написал.
Cuno
и засунул его в Arc
Cuno
почему чтобы его изменять, я должен мьютекс использовать?
Anonymous
засунул thread-safe контейнер в thread-safe контейнер?
Cuno
Arc не thread-safe
Cuno
Ну, не совсем
Anonymous
как это
Cuno
Оно не делает внутренний T thread-safe
Cuno
как это делает мьютекс
Anonymous
thread-safe?
Anonymous
мютекс это примитив для защиты общей информации
Cuno
Так?
Anonymous
причем тут thread safety?
Cuno
Arc не защищает эту самую "общую информацию". Он только позволяет разделенное владение нескольким тредам.
Cuno
засунул thread-safe контейнер в thread-safe контейнер?
Т.е. я не засунул thread-safe контейнер в thread-safe контейнер, а просто разделил владение thread-safe контейнером на несколько тредов.
Anonymous
у тебя проблема с терминами
Anonymous
но ответ на твой вопрос это Arc::into_raw
Cuno
fn into_raw(this: Arc<T>) -> *const T Я не знаком с сырыми указателями в Rust, но опыт в C++ подсказывает мне, что по этому указателю изменять данные нельзя.
Anonymous
получется, что Mutex задает свой get_mut и он вызывается вместо того, что у Arc
Vladimir
@d34d10cc всё просто. Нужно сначала определить, что такое Thread - safe. В раст это понятие разделили на два типажа: Send - можно безопасно отдавать владение другому потоку. Sync - можно безопасно иметь доступ по ссылке к одному объекту. Т.е. большинство вкладывают в термит thread-safe коллекций именно реализацию Sync типажа. Теперь, что касаемо &mut T. Тебе он не нужен. Реализация Thread-safe контейнера, должна иметь интерфейс в котором изменение состояния будет происходить по обычной ссылке & T
Cuno
> Реализация Thread-safe контейнера, должна иметь интерфейс в котором изменение состояния будет происходить по обычной ссылке & T Вот это немного странно выглядит.
Oleg
Interior mutability типа RefCell это не так уж и безопасно.
Cuno
Т.е. shared mutable state на систему типов не ложится никак. Считается, что оно immutable, хотя на самом деле это не так.
Cuno
Похоже это из за конфликта с правилами borrow-checker'а.
Cuno
Окей, значит проблема не в Arc, а в моем "контейнере". Как тогда заставить такой код заработать? https://play.rust-lang.org/?gist=fb072d544ab1e36de2925e44682e1c22&version=stable
Cuno
По ссылке - прямой выстрел в ногу, но предположим, что я знаю что делаю
Маjко
Реализуй для него unsafe Sync
Vladimir
завернуть значение в Atomic
Vladimir
например
Vladimir
и реализация Sync тут не обязательно, любая композиция из Sync полей, автоматически реализует Sync
Cuno
завернуть значение в Atomic
u32 там для примера. В моем коде структура с несколькими полями. Судя по всему стоит лезть и смотреть как эти самые атомики реализованы.
Vladimir
Interior mutability типа RefCell это не так уж и безопасно.
Эмм, может лучше стоит не реализовывать это? Вот человек дело говорит.
Cuno
https://github.com/rust-lang/rust/blob/master/src/libcore/sync/atomic.rs#L126
Cuno
UnsafeCell, ясно
Маjко
Interior mutability типа RefCell это не так уж и безопасно.
А чем он плох? Если случится какое-нибудь говно, он паникнет и положит программу, ничего стрёмного с данными не случится
Oleg
Я уже вижу, что поторопился высказать мнение :)
Dmitry
Не бойся, в продакшн этот код не попадет :D
*годом позже* бло кто эту библиотеку писал?
Мерль
Rust: an example of Autism-Driven Development? https://developers.slashdot.org/comments.pl?sid=10924699&threshold=-1&commentsort=0&mode=thread&pid=54904703
Мерль
>_>
Маjко
АХахахахахаха
Dmitry
I don't intend this to be taken as a joke in any way, nor do I intend it to be unnecessarily mean, but I think that the Rust community inadvertently discovered a new paradigm of software development: Autism-Driven Development.
Dmitry
Мерль
ADD
Alex
Programming languages like Java, Python, C++, Perl and PHP want to be used by normal people.
Alex
> php > normal people
でゲソ
> programming languages > want to be used
でゲソ
Чему я дейсвтительно рад, так это отсутсвию каноничного растоввского code of conduct в этих ваших чатиках
Судзумия
Чатик же
Судзумия
Место дегенерерирования
Anton
Крч посоны
Anton
Пара ансейф блоков
Anton
И мир заиграл радужными цветами
Anton
Охуинно
Anton
Хоть сделал нормальное подобие MVC
Anton
Для gtk
Anton
Пиздато
Anton
Все прям удобно и пиздато стало
Anton
Anton
Годнота
Anton
А то я посмотрел код других проектов где юзали gtk на расте
Anton
И там ебать пиздец какой ад
Cuno
Все прям удобно и пиздато стало
Подожди немного, будешь сегфолты ловить :D
Cuno
станет не так уж и удобно
ne_on
а зачем писать на расет unsafe код вообще
ne_on
оно же специально придумано чтоб избежать всех этих проблем которые возникают в unsafe
Cuno
Многие safe абстракции строятся на основе unsafe кода
Маjко
Чему я дейсвтительно рад, так это отсутсвию каноничного растоввского code of conduct в этих ваших чатиках
Он есть в гиттере. А сюда люди приходят немного обосрать друг друга... и го.
Маjко
а зачем писать на расет unsafe код вообще
Лучше немного локализованного ансейфа, чем адская нечитабельная лапша с кучей потенциальных логических и рхитектурных ошибок)
Маjко
Ты ж не стал бы всерьез писать дерево на Rc, скорее взял бы голые поинтеры и покрыл тестами по самые гланды, чтобы убедиться в безопасности
Berkus
однако деревья на Vec<Node> популярны я смотрю, аж три крейта нашел про это дело
Маjко
Единственный способ сделать деревья в safe rust без утечек памяти
Vladimir
Как-то так и пилятся всякие ecs вроде
entity component system ? Там разве не одно из свойств "быстрое получение всех элементов"?
Vladimir
Многие safe абстракции строятся на основе unsafe кода
Но еще часто ансейф - это признак того, что ты делаешь что-то не верно. Тут главное "первым надеть халат".
Nikita
Есть ли крейт с вектором, который имеет статический капасити и хранится на стеке?
պլհկ
smallvec
Nikita
Так это же массив, а не вектор.
Там может быть меньше элементов, чем капасити