ссылку и передаёт в новый тред,
после цикла ждёт все треды (через хендлеры).
ошибка: thread::spawn(move
lifetime `'static` required
советует 'static, добавил,
получил: borrowed value does not live long enough
вопрос: а как надо?)
код дай, на словах непонятно что ты делаешь
можешь просто код цикла, необязательно его менять чтобы он заработал в плейграунде, скорее всего так решим
Пересылка в другой тред через std’шный thread::spawn требует ’static Ты не можешь не ’static ссылки так отправлять в другой тред. Либо стирай лайфтайм, либо юзай scoped-треды из crossbeam.
вызов функции, которая зхапускает и ждёт треды
сама функция, заимствующая ссылку на image
как ты заслонил пальцем часть скриншота?
я бы вместо &RgbaImage, &BitMap передавал и хранил бы везде Arc<Mutex<RgbaImage>>, Arc<Mutex<BitMap>>, не делай никогда Arc<Mutex<&T>>
хороший скоуп, да
так он потом ругается, что я не могу вернуть bitmap или нет...
ыыы, но та часть с потоками выглядит как велосипед. Если число строк известно, то не нужно считать хендлы, надо запланировать всё заранее
и какой-то rayon возможно впридачу.
спать и чекать счётчик?
да, типа не понятно зачем ты так сделал
я тоже стал смотреть на rayon, но у него через глобалки. а тут нужен локальный тредпул
стоп, а мне не нужна image_in больше, могу отдать её насовсем
image в Arc нет смысла ложить, можно сразу ссылки раскидывать ну и https://docs.rs/crossbeam/0.8.1/crossbeam/thread/index.html
ок, я просто только с темы сисек подключился, надо прокрутить вначало =)
показалось, что спать и чекать счётчик это костыльнее, чем джоиниться к хендлерам)
тогда другой вопрос, как вернуть из функции Bitmap, который в Arc(Mutex())?
короче заработало только прокидывая Arc<Mutex<Bitmap>> в функцию. не так элегантно как я хотел, зато работает.
Ярослав, вам тот же вопрос =)
std.rs/arc и листать методы Arc
https://doc.rust-lang.org/stable/std/sync/struct.Arc.html#method.try_unwrap он тебе про этот метод говорил
А еще и от Arc можно уйти, если воспользоваться crossbeam scope. Только он сам раскидает треды, так что параметр num threads уйдет: extern crate crossbeam_utils; use std::sync::Mutex; fn main() { use crossbeam_utils::thread; let v = Mutex::new(vec![1, 2, 3]); let handle = &v; thread::scope(|s| { for i in 0..3 { s.spawn(move |_| { handle.lock().unwrap()[i] += 1; }); } }).unwrap(); dbg!(v); } (подскажите, можно ли убрать этот handle, чет у меня мозги не варят под конец дня)
еще у тебя очень сильная зависимость от лока на bitmap. по сути ты только строки генерируешь. тебе не надо лочить весь битмап, лучше собери строки без лока битмапа, а потом в конце запиши их в битмап.
тогда у тебя будет вот так: 1. для каждой строки 2.1 запустить scope для генерации границы строки 2.2 положить результат в очередь с индексом строки 3. пробежаться по очереди и сделать dst.set_line без арков, мьютексов и проч проч.
Обсуждают сегодня