<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3772076</guid>
        <pubDate>Thu, 14 Jun 2018 11:26:08 +0000</pubDate>
        <title>Неправильные Rust-философы</title>
        <link>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3772076</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413002&view=findpost&p=3771514'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-06-08T09:15:09+03:00">08.06.18, 06:15</time></span><div class='quote '>2) Освобождение ресурса &quot;вилка&quot; предусмотрено не было</div></div><br>
Тут RAII используется. mutex.lock().unwrap() выдаёт нечто, что ты можешь использовать как объект, защищаемый мьютексом и что в drop-e (это полный аналог плюсовых деструкторов) вызовет unlock.]]></description>
        <author>OpenGL</author>
        <category>Rust</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3771514</guid>
        <pubDate>Fri, 08 Jun 2018 06:15:09 +0000</pubDate>
        <title>Неправильные Rust-философы</title>
        <link>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3771514</link>
        <description><![CDATA[JoeUser: Вощем, на сколько я понял, реализация была сделана несколько топорно, а именно:<br><br>1) Времена &quot;взятия вилок&quot;, &quot;время еды&quot; были константами - такого не бывает<br>2) Освобождение ресурса &quot;вилка&quot; предусмотрено не было<br><br>По-сему, если бы последний философ &quot;не был бы левшой&quot;, процесс бы вообще в большинстве случаев ловил бы дедлок.<br>Ради интереса и обучения - постараюсь переделать.]]></description>
        <author>JoeUser</author>
        <category>Rust</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3771441</guid>
        <pubDate>Thu, 07 Jun 2018 14:13:09 +0000</pubDate>
        <title>Неправильные Rust-философы</title>
        <link>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3771441</link>
        <description><![CDATA[JoeUser: Убрал первую задержку в 150мс, &quot;философы&quot; начали обедать &quot;правильно&quot;. Хм ... :-?]]></description>
        <author>JoeUser</author>
        <category>Rust</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3771408</guid>
        <pubDate>Thu, 07 Jun 2018 10:05:49 +0000</pubDate>
        <title>Неправильные Rust-философы</title>
        <link>https://forum.sources.ru/index.php?showtopic=413002&amp;view=findpost&amp;p=3771408</link>
        <description><![CDATA[JoeUser: Приветствую&#33;<br>
<br>
Решил скомпилировать тестовую программу &quot;Обедающие философы&quot; на языке Rust из <a class='tag-url' href='http://rurust.github.io/rust_book_ru/src/dining-philosophers.html' target='_blank'>мануала</a>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">use std::thread;</div><div class="code_line">use std::time::Duration;</div><div class="code_line">use std::sync::{Mutex, Arc};</div><div class="code_line">&nbsp;</div><div class="code_line">struct Philosopher {</div><div class="code_line">&nbsp;&nbsp; &nbsp;name: String,</div><div class="code_line">&nbsp;&nbsp; &nbsp;left: usize,</div><div class="code_line">&nbsp;&nbsp; &nbsp;right: usize,</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">impl Philosopher {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn new(name: &amp;str, left: usize, right: usize) -&#62; Philosopher {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Philosopher {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;name: name.to_string(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;left: left,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;right: right,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn eat(&amp;self, table: &amp;Table) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;let _left = table.forks[self.left].lock().unwrap();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;thread::sleep(Duration::from_millis(150));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;let _right = table.forks[self.right].lock().unwrap();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;println!(&quot;{} начала есть.&quot;, self.name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;thread::sleep(Duration::from_millis(1000));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;println!(&quot;{} закончила есть.&quot;, self.name);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">struct Table {</div><div class="code_line">&nbsp;&nbsp; &nbsp;forks: Vec&#60;Mutex&#60;()&#62;&#62;,</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">fn main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;let table = Arc::new(Table { forks: vec![</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Mutex::new(()),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Mutex::new(()),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Mutex::new(()),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Mutex::new(()),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Mutex::new(()),</div><div class="code_line">&nbsp;&nbsp; &nbsp;]});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;let philosophers = vec![</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Philosopher::new(&quot;Джудит Батлер&quot;, 0, 1),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Philosopher::new(&quot;Рая Дунаевская&quot;, 1, 2),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Philosopher::new(&quot;Зарубина Наталья&quot;, 2, 3),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Philosopher::new(&quot;Эмма Гольдман&quot;, 3, 4),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Philosopher::new(&quot;Анна Шмидт&quot;, 0, 4),</div><div class="code_line">&nbsp;&nbsp; &nbsp;];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;let handles: Vec&#60;_&#62; = philosophers.into_iter().map(|p| {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;let table = table.clone();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;thread::spawn(move || {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;p.eat(&amp;table);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;})</div><div class="code_line">&nbsp;&nbsp; &nbsp;}).collect();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for h in handles {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;h.join().unwrap();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Компилятор версии 1.25 под FreeBSD из портов. Все компилируется и запускается. <br>
Одна проблема -  &quot;философы&quot; едят последовательно, а должны асинхронно. <br>
<br>
Что я делаю не так? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-06-07T10:15:23+00:00">07.06.18, 10:15</time></span></span><br>
ЗЫ: Более того, этот же пример на <a class='tag-url' href='https://play.rust-lang.org' target='_blank'>https://play.rust-lang.org</a> также работает неправильно.]]></description>
        <author>JoeUser</author>
        <category>Rust</category>
      </item>
	
      </channel>
      </rss>
	