На главную
ПРАВИЛА 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,0795 ]   [ 19 queries used ]   [ Generated: 22.06.18, 00:08 GMT ]