<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FCSharp_Tutorial%2FThread%2FThread_DeadLock</id>
		<title>Csharp/CSharp Tutorial/Thread/Thread DeadLock - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FCSharp_Tutorial%2FThread%2FThread_DeadLock"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Thread_DeadLock&amp;action=history"/>
		<updated>2026-04-29T21:31:21Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Thread_DeadLock&amp;diff=6650&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Thread_DeadLock&amp;diff=6650&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:53Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:31, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Thread_DeadLock&amp;diff=6651&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Thread_DeadLock&amp;diff=6651&amp;oldid=prev"/>
				<updated>2010-05-26T12:20:09Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==A sure-fire deadlock==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
using System.IO;&lt;br /&gt;
using System.Reflection;&lt;br /&gt;
using System.Runtime;&lt;br /&gt;
using System.Runtime.rupilerServices;&lt;br /&gt;
using System.Security;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
public class MainClass&lt;br /&gt;
{&lt;br /&gt;
    private static object deadlockA = new object();&lt;br /&gt;
    private static object deadlockB = new object();&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        lock (deadlockA) {&lt;br /&gt;
            ThreadPool.QueueUserWorkItem(delegate {&lt;br /&gt;
                lock (deadlockB) {&lt;br /&gt;
                    Console.WriteLine(&amp;quot;A&amp;quot;);&lt;br /&gt;
                    lock (deadlockA) {&lt;br /&gt;
                        Console.WriteLine(&amp;quot;B&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            lock (deadlockB) {&lt;br /&gt;
                Console.WriteLine(&amp;quot;Main: got b&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Main: got b&lt;br /&gt;
A&lt;br /&gt;
B&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Dining Philosopher==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;/*&lt;br /&gt;
Quote from &lt;br /&gt;
C# and the .NET Framework&lt;br /&gt;
by Bob Powell &lt;br /&gt;
*/&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
public struct PhilosopherData {&lt;br /&gt;
  public int        PhilosopherId;&lt;br /&gt;
  public Mutex      RightChopStick;&lt;br /&gt;
  public Mutex      LeftChopStick;&lt;br /&gt;
  public int        AmountToEat;&lt;br /&gt;
  public int        TotalFood;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Philosopher : WorkerThread&lt;br /&gt;
{&lt;br /&gt;
  public Philosopher( object data ) : base( data ) { }&lt;br /&gt;
  protected override void Run( ) {&lt;br /&gt;
    PhilosopherData pd = (PhilosopherData)Data;&lt;br /&gt;
    Random r = new Random( pd.PhilosopherId );&lt;br /&gt;
    Console.WriteLine(&amp;quot;Philosopher {0} ready&amp;quot;, pd.PhilosopherId );&lt;br /&gt;
    WaitHandle[] chopSticks =  new WaitHandle[] { pd.LeftChopStick, pd.RightChopStick };&lt;br /&gt;
    while( pd.TotalFood &amp;gt; 0 ) {&lt;br /&gt;
      //Get both chop sticks&lt;br /&gt;
      WaitHandle.WaitAll( chopSticks );&lt;br /&gt;
      Console.WriteLine(&amp;quot;Philosopher {0} eating {1} of {2} food&amp;quot;, pd.PhilosopherId, pd.AmountToEat, pd.TotalFood );&lt;br /&gt;
      pd.TotalFood -= pd.AmountToEat;&lt;br /&gt;
      Thread.Sleep( r.Next(1000,5000) );&lt;br /&gt;
      &lt;br /&gt;
      //Release the chopsticks&lt;br /&gt;
      Console.WriteLine(&amp;quot;Philosopher {0} thinking&amp;quot;, pd.PhilosopherId);&lt;br /&gt;
      pd.RightChopStick.ReleaseMutex( );&lt;br /&gt;
      pd.LeftChopStick.ReleaseMutex( );&lt;br /&gt;
      //Think for a random time length&lt;br /&gt;
      Thread.Sleep( r.Next(1000,5000) );&lt;br /&gt;
    }&lt;br /&gt;
    Console.WriteLine(&amp;quot;Philosopher {0} finished&amp;quot;, pd.PhilosopherId );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Restaurant {&lt;br /&gt;
  public static void Main( ) {&lt;br /&gt;
    Mutex[] chopSticks = new Mutex[5];&lt;br /&gt;
    //init the chopSticks&lt;br /&gt;
    for( int i = 0; i &amp;lt; 5; i++ )&lt;br /&gt;
      chopSticks[i] = new Mutex( false );&lt;br /&gt;
    &lt;br /&gt;
    //Create the Five Philosophers&lt;br /&gt;
    for( int i = 0; i &amp;lt; 5; i++ ) {&lt;br /&gt;
      PhilosopherData pd;&lt;br /&gt;
      pd.PhilosopherId = i + 1;&lt;br /&gt;
      pd.RightChopStick = chopSticks[ i - 1 &amp;gt;= 0 ? ( i - 1 ) : 4 ];&lt;br /&gt;
      pd.LeftChopStick = chopSticks[i];&lt;br /&gt;
      pd.AmountToEat = 5;&lt;br /&gt;
      pd.TotalFood = 35;&lt;br /&gt;
      Philosopher p = new Philosopher( pd );&lt;br /&gt;
      p.Start( );&lt;br /&gt;
    }&lt;br /&gt;
    Console.ReadLine( );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public abstract class WorkerThread {&lt;br /&gt;
  private object  ThreadData;&lt;br /&gt;
  private Thread  thisThread;&lt;br /&gt;
&lt;br /&gt;
  //Properties&lt;br /&gt;
  public object Data {&lt;br /&gt;
    get { return ThreadData; }&lt;br /&gt;
    set { ThreadData = value; }&lt;br /&gt;
  }&lt;br /&gt;
  public object IsAlive {&lt;br /&gt;
    get { return thisThread == null ? false : thisThread.IsAlive; }&lt;br /&gt;
  }&lt;br /&gt;
  /// &amp;lt;summary&amp;gt;&lt;br /&gt;
  /// Constructors&lt;br /&gt;
  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
  public WorkerThread( object data ) {&lt;br /&gt;
    this.ThreadData = data;&lt;br /&gt;
  }&lt;br /&gt;
  public WorkerThread( ) {&lt;br /&gt;
    ThreadData = null;&lt;br /&gt;
  }&lt;br /&gt;
  /// &amp;lt;summary&amp;gt;&lt;br /&gt;
  /// Public Methods&lt;br /&gt;
  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  /// &amp;lt;summary&amp;gt;&lt;br /&gt;
  /// Start the worker thread&lt;br /&gt;
  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
  public void Start( ) {&lt;br /&gt;
    thisThread = new Thread( new ThreadStart( this.Run ) );&lt;br /&gt;
    thisThread.Start();&lt;br /&gt;
  }&lt;br /&gt;
  /// &amp;lt;summary&amp;gt;&lt;br /&gt;
  /// Stop the current thread.  Abort causes&lt;br /&gt;
  /// a ThreadAbortException to be raised within&lt;br /&gt;
  /// the thread&lt;br /&gt;
  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
  public void Stop( ) {&lt;br /&gt;
    thisThread.Abort( );&lt;br /&gt;
    while( thisThread.IsAlive ) ;&lt;br /&gt;
    thisThread = null;&lt;br /&gt;
  }&lt;br /&gt;
  /// &amp;lt;summary&amp;gt;&lt;br /&gt;
  /// To be implemented by derived threads&lt;br /&gt;
  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
  protected abstract void Run( );&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Philosopher 1 ready&lt;br /&gt;
Philosopher 1 eating 5 of 35 food&lt;br /&gt;
Philosopher 2 ready&lt;br /&gt;
Philosopher 3 ready&lt;br /&gt;
Philosopher 3 eating 5 of 35 food&lt;br /&gt;
Philosopher 4 ready&lt;br /&gt;
Philosopher 5 ready&lt;br /&gt;
Philosopher 1 thinking&lt;br /&gt;
Philosopher 5 eating 5 of 35 food&lt;br /&gt;
Philosopher 3 thinking&lt;br /&gt;
Philosopher 2 eating 5 of 35 food&lt;br /&gt;
Philosopher 5 thinking&lt;br /&gt;
Philosopher 4 eating 5 of 35 food&lt;br /&gt;
^CTerminate batch job (Y/N)? n&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>