Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2018, 13:40   #1
Majestio
Пользователь
 
Аватар для Majestio
 
Регистрация: 12.07.2012
Сообщений: 65
По умолчанию Заставить философов обедать правильно

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

Код:
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();
	}
}
Использую компилятор v.1.25 под FreeBSD 11.1. Все успешно собирается и исполняется. Только одно "но" - "философы" обедают последовательно, а не параллельно. На всякий случай попробовал этот же пример выполнить в онлайн-среде play.rust-lang.org. Работает так же неправильно!

Что я делаю не так? Что нужно изменить, чтобы пример заработал правильно?
Мои программные ништякиhttps://majestio.info
Majestio вне форума Ответить с цитированием
Старый 08.06.2018, 00:11   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Я вообще фигею, как они у Вас умудряются поесть.
Они при таком коде должны все схватить левую вилку и впасть в тупой клинч.
По условию же они должны бросать левую вилку, если не удалось ухватить правую.
То есть примерно так:
Код:
	fn try_eat(&self, table: &Table) -> bool {
		let _left = table.forks[self.left].lock().unwrap();
		thread::sleep(Duration::from_millis(50));
		let right = table.forks[self.right].try_lock();
		if let Ok(ref _guard) = right {
    		println!("{} начала есть.", self.name);
    		thread::sleep(Duration::from_millis(1000));
    		println!("{} закончила есть.", self.name);
    		return true;
		}
		false
	}
	
	fn eat(&self, table: &Table) {
	    while ! self.try_eat(table) {
    		thread::sleep(Duration::from_millis(250));
	    } 
	}
Код:
Анна Шмидт начала есть.
Анна Шмидт закончила есть.
Джудит Батлер начала есть.
Эмма Гольдман начала есть.
Джудит Батлер закончила есть.
Рая Дунаевская начала есть.
Эмма Гольдман закончила есть.
Рая Дунаевская закончила есть.
Зарубина Наталья начала есть.
Зарубина Наталья закончила есть.
Понял - последняя у Вас левша, она сначала пытается не ту вилку ухватить.
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Php, помогите правильно обратиться к массивам, чтоб правильно отобразить html KBO PHP 1 18.08.2016 23:49
Что не правильно? Программа на C++ находит минимум правильно, а максимум нет. В чем погрешность? rafael999 Помощь студентам 3 26.10.2013 11:21
Очень нужно решение задачи Обедающих философов с использованием событий RAZOR1703 Помощь студентам 0 19.10.2011 00:08
Про обедающих философов Авторитет C# (си шарп) 0 29.09.2011 11:36
Не правильно (или правильно?) работает позиционирование в WebKit mutabor HTML и CSS 5 09.12.2010 09:54