Size: a a a

Rust — русскоговорящее сообществo

2020 October 20

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Sync по-моему некорректный
источник

Э

Эрик in Rust — русскоговорящее сообществo
Кирилл
Пытаюсь сделать обёртку, которая один раз в одном месте set-ится, и в других местах проверяется на готовность и get-ится. Сеттер выглядит так. Не смог придумать ситуацию, когда это может сломаться, но всё равно страшновато) Подскажите, плз
Убери ансейф имплы, просто используй once_cell::sync::OnceCell.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Send тоже
источник

Э

Эрик in Rust — русскоговорящее сообществo
Он автоматически и сендится и синкится.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Он автоматически и сендится и синкится.
При условии, что T так может
источник

К

Кирилл in Rust — русскоговорящее сообществo
Mikail Bagishov
При условии, что T так может
Ага
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Безусловного Send и Sync тут быть не может
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
При условии, что T так может
А если не может, то имплементить это дело — UB, нет?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
А если не может, то имплементить это дело — UB, нет?
Да. Поэтому я и говорю, что оба ансейф импла выше неверны
источник

К

Кирилл in Rust — русскоговорящее сообществo
Mikail Bagishov
Да. Поэтому я и говорю, что оба ансейф импла выше неверны
Не хотелось бы на T ограничения накладывать. Можно, пожалуйста подробнее, почему эти Send и Sync - UB?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Кирилл
Не хотелось бы на T ограничения накладывать. Можно, пожалуйста подробнее, почему эти Send и Sync - UB?
Из двух тредов твой сет позовут если, будет гонка данных. Гонка данных — UB.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Уже за тебя умные люди подумали и сделали мультитредовую версию без UB.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Кирилл
Не хотелось бы на T ограничения накладывать. Можно, пожалуйста подробнее, почему эти Send и Sync - UB?
Ты написал, что обертка позволяет переходить &Wrapper<T> -> &T.
Тогда если у разных потоков есть ссылка на Wrapper, то у них появляется и одновремнные ссылки на T, а для !Sync это запрещено
источник

Э

Эрик in Rust — русскоговорящее сообществo
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Про Send. Если я создам в одном потоке этот Wrapper, а потом отправлю в другой поток, то и деструктор будет выполнен там.
Следовательно объект владелся разными потоками, а для !Send это запрещено
источник

К

Кирилл in Rust — русскоговорящее сообществo
Mikail Bagishov
Ты написал, что обертка позволяет переходить &Wrapper<T> -> &T.
Тогда если у разных потоков есть ссылка на Wrapper, то у них появляется и одновремнные ссылки на T, а для !Sync это запрещено
Я имплементю Send и Sync только для сеттера
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Оокей, тогда я не так тебя понял.
Но мой пример с дропом все еще подходит.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
А impl Sync в таком случае выглядит уместным
источник

К

Кирилл in Rust — русскоговорящее сообществo
Mikail Bagishov
Оокей, тогда я не так тебя понял.
Но мой пример с дропом все еще подходит.
Ок, насчёт Send согласен.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Mikail Bagishov
А impl Sync в таком случае выглядит уместным
Хотя не, impl Debug убери
источник