Um código de aprendizagem multithread relativamente clássico.
1. O problema de sincronização multithread é usado.
2. O problema de sequência de multithreading é usado.
Se você estiver interessado, leia o código abaixo com atenção. Preste atenção na ordem dos segmentos de código e pense a respeito. A ordem desses códigos pode ser trocada? Isso deve ser útil para o aprendizado. Para fins de demonstração, deixe todos os threads hibernarem por um tempo.
usando System.Net;
usando o sistema;
usando System.IO;
usando System.Text;
usando System.Threading;
usando
o namespace System.Diagnostics Webb.Study
;
{
classe TestThread
{
Mutex estático m_Mutex = novo Mutex();
Tópico estático[] m_testThreads = novo Tópico[10];
estático int m_threadIndex = 0;
estático void ThreadCallBack()
{
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
Console.WriteLine("Início do tópico {0}.",m_index);
para(int i=0;i<=10;i++)
{
TestThread.m_Mutex.WaitOne();
Console.WriteLine("Tópico {0}: está em execução. {1}",m_index,i);
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
}
Console.WriteLine("Tópico {0} final.",m_index);
}
public static void Principal(String[] args)
{
Console.WriteLine("Início do thread principal.");
for(int i=0;i<TestThread.m_testThreads.Length;i++)
{
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = novo Thread(new ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
}
for(int i=0;i<TestThread.m_testThreads.Length;i++)
{
TestThread.m_testThreads[i].Join();
}
Console.WriteLine("Saída do thread principal.");
}
}
}
1. Essas duas sentenças da função principal podem ser trocadas? Por que?
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
2. Essas duas frases na função CallBack podem ser trocadas? Por que? Qual seria um resultado diferente?
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep
(100);
Por que? Qual seria um resultado diferente?
público estático void Principal(String[] args)
{
Console.WriteLine("Início do thread principal.");
for(int i=0;i<TestThread.m_testThreads.Length;i++)
{
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = novo Thread(new ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
TestThread.m_testThreads[i].Join();
Thread.Sleep(100);
}
Console.WriteLine("Saída do thread principal.");
}
4. Qual é a função destas frases? Então, que tipo de problemas ainda existem no programa? Que modificações devem ser feitas?
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
apenas para aprendizagem e discussão.