На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser
  
> Многопоточное заполнение вектора без unsafe в Rust
    Можно ли сделать сабж? Нагуглил решение со сторонними библиотеками или с помощью unsafe. Можно ли это сделать, не пользуясь ни первым, ни вторым, и, разумеется, без блокировок?
    Сообщение отредактировано: OpenGL -
    Подпись была включена в связи с окончанием срока наказания
      событиями и управляющим потоком? Т.е. заполняет один, но данные поступают от нескольких. Не устраивает?
      Долог путь в бессмертие... я еще вернусь.
      Профильный скилл "Телепатия" 8%
      ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
      Прошу потестить игру.
        Про такой способ я не подумал. Но в любом случае это не настолько интересно, как стандартный "разбить вектор на n частей, каждую часть отдать своему потоку", который, собственно, я и попытался изначально написать. Думал, удастся подшаманить с каким-нибудь split_at_mut - не получилось. Вот и стало интересно - это я не осилил, или реально это делается только с unsafe?
        Подпись была включена в связи с окончанием срока наказания
          Почитал немного про split_at_mut, думаю, можно именно поделить, можно ещё с chunks_mut как я понимаю, тогда, если раздавать по куску вектора, должна быть потоковая безопасность.
          Сообщение отредактировано: Vesper -
          Долог путь в бессмертие... я еще вернусь.
          Профильный скилл "Телепатия" 8%
          ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
          Прошу потестить игру.
            Вот у меня не получилось - так и не придумал, как сказать потоку, который получит ссылку на slice - результат split_at_mut, сказать, что ссылка будет жива пока он работает. Может как-то с lifetime поиграться надо будет.

            Добавлено
            PS: пробовал написать так (через split_first_mut, но это не принципиально :)):
            ExpandedWrap disabled
              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 => {}
                  }
              }

            Это не компилится. Ошибка не самая очевидная (я, если честно, толком и не понял, что он от меня хочет :crazy: ), но, впрочем, я ожидал, что не скомпилится из-за лайфтаймов, так что особо не разбирался
            ExpandedWrap disabled
              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, то с его помощью задача бы легко решилась.
            Подпись была включена в связи с окончанием срока наказания
              не хватает знаний :( И думаю, что надо перенести название языка в основной заголовок, а то непонятно, то ли алгоритмический вопрос, то ли надо выбрать язык под задачу.
              Долог путь в бессмертие... я еще вернусь.
              Профильный скилл "Телепатия" 8%
              ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
              Прошу потестить игру.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0943 ]   [ 17 queries used ]   [ Generated: 21.10.19, 13:06 GMT ]