비교적 고전적인 멀티스레드 학습 코드입니다.
1. 다중 스레드 동기화 문제가 사용됩니다.
2. 멀티스레딩의 순서 문제를 사용한다.
관심이 있으시면 아래 코드를 주의 깊게 읽어보시기 바랍니다. 코드 세그먼트의 순서에 주의를 기울이고 생각해 보세요. 왜 이러한 코드의 순서가 바뀔 수 있습니까? 이는 학습에 도움이 될 것입니다. 데모 목적으로 잠시 동안 모든 스레드를 휴면 상태로 둡니다.
System.Net 사용;
시스템 사용;
System.IO 사용;
System.Text 사용;
System.Threading 사용;
System.Diagnostics
네임스페이스 Webb.Study
사용
{
클래스 TestThread
{
static Mutex m_Mutex = new Mutex();
static Thread[] m_testThreads = new Thread[10];
정적 int m_threadIndex = 0;
정적 무효 ThreadCallBack()
{
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
Console.WriteLine("스레드 {0} 시작.",m_index);
for(int i=0;i<=10;i++)
{
TestThread.m_Mutex.WaitOne();
Console.WriteLine("스레드 {0}: 실행 중입니다. {1}",m_index,i);
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
}
Console.WriteLine("스레드 {0} 끝.",m_index);
}
공개 정적 무효 Main(String[] args)
{
Console.WriteLine("메인 스레드 시작.");
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("메인 스레드 종료.");
}
}
}
1. main 함수의 두 문장을 바꿔서 쓸 수 있나요? 왜?
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
2. CallBack 함수에서 이 두 문장을 바꿔서 사용할 수 있나요? 왜? 다른 결과는 무엇입니까?
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
3. 메인 함수를 이렇게 작성할 수 있나요? 왜? 다른 결과는 무엇입니까?
공개 정적 무효 Main(String[] args)
{
Console.WriteLine("메인 스레드 시작.");
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("메인 스레드 종료.");
}
4. 이 문장들의 기능은 무엇입니까? 그렇다면 프로그램에는 어떤 종류의 문제가 여전히 존재하는가? 어떤 수정을 해야 합니까?
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
학습 및 토론 전용입니다.