Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.242.22] |
|
Сообщ.
#1
,
|
|
|
Можно ли сделать сабж? Нагуглил решение со сторонними библиотеками или с помощью unsafe. Можно ли это сделать, не пользуясь ни первым, ни вторым, и, разумеется, без блокировок?
|
Сообщ.
#2
,
|
|
|
событиями и управляющим потоком? Т.е. заполняет один, но данные поступают от нескольких. Не устраивает?
|
Сообщ.
#3
,
|
|
|
Про такой способ я не подумал. Но в любом случае это не настолько интересно, как стандартный "разбить вектор на n частей, каждую часть отдать своему потоку", который, собственно, я и попытался изначально написать. Думал, удастся подшаманить с каким-нибудь split_at_mut - не получилось. Вот и стало интересно - это я не осилил, или реально это делается только с unsafe?
|
Сообщ.
#4
,
|
|
|
Почитал немного про split_at_mut, думаю, можно именно поделить, можно ещё с chunks_mut как я понимаю, тогда, если раздавать по куску вектора, должна быть потоковая безопасность.
|
Сообщ.
#5
,
|
|
|
Вот у меня не получилось - так и не придумал, как сказать потоку, который получит ссылку на slice - результат split_at_mut, сказать, что ссылка будет жива пока он работает. Может как-то с lifetime поиграться надо будет.
Добавлено PS: пробовал написать так (через split_first_mut, но это не принципиально ): fn start_one_thread(a : &mut [i32], children : &mut Vec<thread::JoinHandle<()>>) { match a.split_first_mut() { Some(val) => { let mut x = val.0; children.push(thread::spawn(move|| { *x = 42; })); start_one_thread(val.1, children); } None => {} } } Это не компилится. Ошибка не самая очевидная (я, если честно, толком и не понял, что он от меня хочет ), но, впрочем, я ожидал, что не скомпилится из-за лайфтаймов, так что особо не разбирался main.rs:7:10: 7:25 error: cannot infer an appropriate lifetime for autoref due to conflicting requirements [E0495] main.rs:7 match a.split_first_mut() ^~~~~~~~~~~~~~~ main.rs:7:8: 7:9 note: first, the lifetime cannot outlive the expression at 7:7... main.rs:7 match a.split_first_mut() ^ main.rs:7:8: 7:9 note: ...so that auto-reference is valid at the time of borrow main.rs:7 match a.split_first_mut() ^ main.rs:7:8: 7:27 note: but, the lifetime must be valid for the method call at 7:7... main.rs:7 match a.split_first_mut() ^~~~~~~~~~~~~~~~~~~ main.rs:7:8: 7:9 note: ...so that method receiver is valid for the method call main.rs:7 match a.split_first_mut() Если меняю первый аргумент на a : &'static mut [i32], то функция компилится, но, понятно, не получается её вызвать - переданный slice static-ом не является. Добавлено Вообще, в старых версиях был thread::scoped. Вот если я правильно понял концепцию borrowing и lifetime, то с его помощью задача бы легко решилась. |
Сообщ.
#6
,
|
|
|
не хватает знаний И думаю, что надо перенести название языка в основной заголовок, а то непонятно, то ли алгоритмический вопрос, то ли надо выбрать язык под задачу.
|