Ein relativ klassischer Multithread-Lerncode.
1. Es wird ein Multithread-Synchronisationsproblem verwendet.
2. Das Sequenzproblem des Multithreadings wird verwendet.
Wenn Sie interessiert sind, lesen Sie bitte den folgenden Code sorgfältig durch. Achten Sie auf die Reihenfolge der Codesegmente und überlegen Sie, ob die Reihenfolge dieser Codes vertauscht werden kann. Dies sollte beim Lernen hilfreich sein. Lassen Sie zu Demonstrationszwecken alle Threads eine Weile ruhen.
mit System.Net;
Verwenden des Systems;
mit System.IO;
Verwenden von System.Text;
Verwenden von System.Threading;
mit System.Diagnostics;
Namespace Webb.Study
{
Klasse TestThread
{
statischer Mutex m_Mutex = new Mutex();
static Thread[] m_testThreads = new Thread[10];
static int m_threadIndex = 0;
static void ThreadCallBack()
{
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
Console.WriteLine("Thread {0} start.",m_index);
for(int i=0;i<=10;i++)
{
TestThread.m_Mutex.WaitOne();
Console.WriteLine("Thread {0}: läuft. {1}",m_index,i);
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
}
Console.WriteLine("Thread {0} Ende.",m_index);
}
public static void Main(String[] args)
{
Console.WriteLine("Hauptthreadstart.");
for(int i=0;i
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = new Thread(new ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
}
for(int i=0;i
TestThread.m_testThreads[i].Join();
}
Console.WriteLine("Hauptthread-Exit.");
}
}
}
1. Können diese beiden Sätze in der Hauptfunktion vertauscht werden? Warum?
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
2. Können diese beiden Sätze in der CallBack-Funktion vertauscht werden? Warum? Was wäre ein anderes Ergebnis?
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
3. Kann die Hauptfunktion so geschrieben werden? Warum? Was wäre ein anderes Ergebnis?
public static void Main(String[] args)
{
Console.WriteLine("Hauptthreadstart.");
for(int i=0;i
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = new Thread(new ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
TestThread.m_testThreads[i].Join();
Thread.Sleep(100);
}
Console.WriteLine("Hauptthread-Exit.");
}
4. Welche Funktion haben diese Sätze? Welche Probleme gibt es also noch im Programm? Welche Änderungen sollten vorgenommen werden?
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
nur zum Lernen und zur Diskussion.