На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Коротко о разделе:
Здесь разрешается создавать темы, относящиеся к любому языку программирования, для которого не существует раздела на форуме (например, Lisp, Tcl/Tk, FORTRAN и т.д.). Если раздел для нужного Вам языка есть, большая просьба создавать тему в нем.
Вопросы, связанные с JScript, Perl, PHP обсуждаются в разделе WWW Masters.

Обратите внимание:
1. Прежде чем задать вопрос, воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали.
2. Если Ваш вопрос связан с конкретным языком программирования, обязательно укажите название языка в имени темы.
3. Постарайтесь давать темам информативные названия. Темы с названиями типа "Помогите, горю" будут удалены.
4. Помните, чем грамотней будет задан Ваш вопрос, тем больше будет у Вас шансов получить на него ответ. Как правильно задавать вопросы
5. Ипользуйте тег [ code ] ...текст программы... [ /code ] для выделения текста программы.

Просьбы выполнить какую-либо работу за автора в этом разделе не обсуждаются. Темы с подобными просьбами будут перемещены или удалены. Для заказов у нас существуют специальные разделы: Разовые заказы и подработка, ПОМОЩЬ СТУДЕНТАМ.

Если кто не понял (а такие есть) — чтобы за вас решали ваши задачки, идите на другие ресурсы.

Полезные ссылки:
Есть. ;)
Наши Исходники | GPSS (en), GPSS (ru) (!) | Common Lisp | Tcl/Tk | Haskell | Lua
Модераторы: B.V.
  
> Неправильные Rust-философы, тестовая программа работает не так как ожидалось
    Приветствую!

    Решил скомпилировать тестовую программу "Обедающие философы" на языке Rust из мануала:

    ExpandedWrap disabled
      use std::thread;
      use std::time::Duration;
      use std::sync::{Mutex, Arc};
       
      struct Philosopher {
          name: String,
          left: usize,
          right: usize,
      }
       
      impl Philosopher {
          fn new(name: &str, left: usize, right: usize) -> Philosopher {
              Philosopher {
                  name: name.to_string(),
                  left: left,
                  right: right,
              }
          }
       
          fn eat(&self, table: &Table) {
              let _left = table.forks[self.left].lock().unwrap();
              thread::sleep(Duration::from_millis(150));
              let _right = table.forks[self.right].lock().unwrap();
              println!("{} начала есть.", self.name);
              thread::sleep(Duration::from_millis(1000));
              println!("{} закончила есть.", self.name);
          }
      }
       
      struct Table {
          forks: Vec<Mutex<()>>,
      }
       
      fn main() {
          let table = Arc::new(Table { forks: vec![
              Mutex::new(()),
              Mutex::new(()),
              Mutex::new(()),
              Mutex::new(()),
              Mutex::new(()),
          ]});
       
          let philosophers = vec![
              Philosopher::new("Джудит Батлер", 0, 1),
              Philosopher::new("Рая Дунаевская", 1, 2),
              Philosopher::new("Зарубина Наталья", 2, 3),
              Philosopher::new("Эмма Гольдман", 3, 4),
              Philosopher::new("Анна Шмидт", 0, 4),
          ];
       
          let handles: Vec<_> = philosophers.into_iter().map(|p| {
              let table = table.clone();
              thread::spawn(move || {
                  p.eat(&table);
              })
          }).collect();
          
          for h in handles {
              h.join().unwrap();
          }
      }


    Компилятор версии 1.25 под FreeBSD из портов. Все компилируется и запускается.
    Одна проблема - "философы" едят последовательно, а должны асинхронно.

    Что я делаю не так?

    Добавлено
    ЗЫ: Более того, этот же пример на https://play.rust-lang.org также работает неправильно.
    Мои программные ништякиhttp://majestio.info
      Убрал первую задержку в 150мс, "философы" начали обедать "правильно". Хм ... :-?
      Мои программные ништякиhttp://majestio.info
        Вощем, на сколько я понял, реализация была сделана несколько топорно, а именно:

        1) Времена "взятия вилок", "время еды" были константами - такого не бывает
        2) Освобождение ресурса "вилка" предусмотрено не было

        По-сему, если бы последний философ "не был бы левшой", процесс бы вообще в большинстве случаев ловил бы дедлок.
        Ради интереса и обучения - постараюсь переделать.
        Мои программные ништякиhttp://majestio.info
          Цитата JoeUser @
          2) Освобождение ресурса "вилка" предусмотрено не было

          Тут RAII используется. mutex.lock().unwrap() выдаёт нечто, что ты можешь использовать как объект, защищаемый мьютексом и что в drop-e (это полный аналог плюсовых деструкторов) вызовет unlock.
          Подпись была включена в связи с окончанием срока наказания
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0730 ]   [ 14 queries used ]   [ Generated: 21.07.18, 13:40 GMT ]