Un código de aprendizaje multiproceso relativamente clásico.
1. Se utiliza el problema de sincronización de subprocesos múltiples.
2. Se utiliza el problema de secuencia de subprocesos múltiples.
Si está interesado, lea atentamente el siguiente código. Preste atención al orden de los segmentos de código y piense en ello. ¿Se puede intercambiar el orden de estos códigos? Esto debería ser útil para aprender. Para fines de demostración, deje que todos los subprocesos duerman por un tiempo.
utilizando System.Net;
usando Sistema;
usando System.IO;
usando System.Text;
usando System.Threading;
usando System.Diagnostics
espacio de nombres Webb.Study;
{
clase TestThread
{
Mutex estático m_Mutex = nuevo Mutex();
Hilo estático [] m_testThreads = nuevo hilo [10];
estático int m_threadIndex = 0;
estático vacío ThreadCallBack();
{
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
Console.WriteLine("Inicio del hilo {0}.",m_index);
para(int i=0;i<=10;i++)
{
TestThread.m_Mutex.WaitOne();
Console.WriteLine("Subproceso {0}: se está ejecutando. {1}",m_index,i);
TestThread.m_Mutex.ReleaseMutex();
Hilo.Sleep(100);
}
Console.WriteLine("Fin del hilo {0}.",m_index);
}
público estático vacío principal (String[] args)
{
Console.WriteLine("Inicio del hilo principal.");
para(int i=0;i<TestThread.m_testThreads.Length;i++)
{
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = nuevo hilo(nuevo ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
Hilo.Sleep(100);
}
para(int i=0;i<TestThread.m_testThreads.Length;i++)
{
TestThread.m_testThreads[i].Join();
}
Console.WriteLine("Salida del hilo principal.");
}
}
}
1. ¿Se pueden intercambiar estas dos oraciones en la función principal? ¿Por qué?
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
2. ¿Se pueden intercambiar estas dos oraciones en la función CallBack? ¿Por qué? ¿Cuál sería un resultado diferente?
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
3. ¿Se puede escribir la función principal así? ¿Por qué? ¿Cuál sería un resultado diferente?
vacío estático público principal (cadena [] argumentos)
{
Console.WriteLine("Inicio del hilo principal.");
para(int i=0;i<TestThread.m_testThreads.Length;i++)
{
TestThread.m_threadIndex = i;
TestThread.m_testThreads[i] = nuevo hilo(nuevo ThreadStart(ThreadCallBack));
TestThread.m_testThreads[i].Start();
TestThread.m_testThreads[i].Join();
Hilo.Sleep(100);
}
Console.WriteLine("Salida del hilo principal.");
}
4. ¿Cuál es la función de estas oraciones? Entonces, ¿qué tipo de problemas existen todavía en el programa? ¿Qué modificaciones se deben hacer?
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
solo para aprendizaje y discusión.