расту давненько. Не могу понять с фига ли до меня компилятор докопался 🤦♂️😡
future cannot be sent between threads safely
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3c749ffecb986059c39af316121ad06b
Пока ре расскоментировать спавн потока (там тудушка)
Там написано, где нужно раскоменнтировать чтобы сломать
Там же написано, дело в Rc: !send
Rc нельзя между потоками передавать, а tokio::spawn потенциально может запустить эту фьючу в другом потоке. Нужен spawn_local какой-то. Если заменить на tokio::task::spawn_local, то компилится.
Дело в том что я и не передаю Rc через потоки....
SomeStruct хранит в себе Rc Токио может воркстилить тасочки, поэтому футура и её составляющие должны быть Send
Ты имеешь ввиду где queue и map? Там в объявлении Rc указаны, больше я их нигде не нашел
Какая разница? Структура не Send
Что такое воркстилить? Давай я чуть перепишу код... Создать Rc нет проблем. А вот воспользоваться им не могу (( https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=60627dee402dcc141897a37d69aeb54d
Это можно решить через LocalSet в Токио, либо убрать Rc
Я думал что если все объекты внутри структуры имплементят send, то и структура тоже является send по умолчанию
Rc то не Send
А в структуре используются Rc, значит она как раз не Send, в ней надо все на Arc
Воркстил это когда свободный поток крадёт задачи из других потоков, чтобы балансировать нагрузку. В расте между потоками можно перемещать только Т: Send
А как код поправить чтоб он работал?
Заменить в полях структуры Rc на Atc
Rc/Arc Либо спавнить в локалсете. Как им пользоваться есть в документации токио
https://docs.rs/tokio/latest/tokio/task/struct.LocalSet.html А, о, спасибо))) Как раз мой случай))
Хотя не, я не кидаю Rc в async move как в примере... у меня все локально используется...
Ещ раз. Твоя структура не Send, так как вложенное в неё поле !Send Отсюда вытекает что вся твоя футура не Send, поэтому такую футуру перемещать нельзя. Тут не влияет, муваешь ты Rc внутрь или нет
Та вот это и не понимаю. Что я ее никуда не муваю.. а ругается что она не Send
Ты не муваешь, а токио внутри себя может мувнуть
Смотри, у тебя 2 таски в одном треде. По очереди складывают счетчик - ок Как только токио считает, что твой тред слишком загруженный, другой тред крадёт 1 таску. Теперь они параллельно начинают прибавлять счетчик. Так как он не атомарный, то может случится одновременный инкремент, то UB.
Ну у меня select уже даже отдельно, some_struct отдельно....
В общем, убирай SomeStruct из футуры Или меняй Rc на Arc
Я даже мутабельные сслыки в select засовываю без проблем... а тут Rc какой-то не понравился
Растбук читать лучше надо было, там об этом точно глава есть Ещё на cheats.rs написано про Send/Sync
https://stackoverflow.com/questions/74497663/why-does-rc-works-in-async-fn не понятно
tokio::select! это макрос который раскроется c .await внутри. Когда происходит .await твоя таска отдаётся экзекьютору, который в следующий раз может отправить её исполнятся на другом потоке. А у тебя между await поинтами непотокобезопасный Rc счётчик. Представь что ты куда то его отправил до .await поинта, а потом после .await поинта ты обращаешься к нему с другого потока
Обсуждают сегодня