โค้ดการเรียนรู้แบบมัลติเธรดที่ค่อนข้างคลาสสิก
1. มีการใช้ปัญหาการซิงโครไนซ์แบบมัลติเธรด
2. มีการใช้ปัญหาลำดับของมัลติเธรด
หากคุณสนใจโปรดอ่านโค้ดด้านล่างอย่างละเอียด ให้ความสนใจกับลำดับของส่วนรหัสแล้วลองคิดดูว่าลำดับของรหัสเหล่านี้สามารถสับเปลี่ยนได้หรือไม่ เพราะเหตุใด สิ่งนี้น่าจะเป็นประโยชน์สำหรับการเรียนรู้ เพื่อจุดประสงค์ในการสาธิต ให้ปล่อยให้เธรดทั้งหมดเข้าสู่โหมดสลีปสักพัก
ใช้ System.Net;
ใช้ระบบ;
ใช้ System.IO;
ใช้ System.Text;
โดยใช้ System.Threading;
ใช้ System.Diagnostics;
Webb.Study
-
คลาส TestThread
-
Mutex แบบคงที่ m_Mutex = Mutex ใหม่ ();
เธรดคงที่ [] m_testThreads = เธรดใหม่ [10];
int แบบคงที่ m_threadIndex = 0;
โมฆะคงที่ ThreadCallBack ()
-
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
Console.WriteLine("เธรด {0} เริ่มต้น",m_index);
สำหรับ(int i=0;i<=10;i++)
-
TestThread.m_Mutex.WaitOne();
Console.WriteLine("Thread {0}: is running. {1}",m_index,i);
TestThread.m_Mutex.ReleaseMutex();
กระทู้.สลีป(100);
-
Console.WriteLine("เธรด {0} สิ้นสุด",m_index);
}
โมฆะสาธารณะคงที่ Main (String [] args)
-
Console.WriteLine("เริ่มเธรดหลัก");
สำหรับ (int i = 0; i <TestThread.m_testThreads.Length; i ++)
-
TestThread.m_threadIndex = ฉัน;
TestThread.m_testThreads[i] = เธรดใหม่ (ThreadStart ใหม่ (ThreadCallBack));
TestThread.m_testThreads[i].เริ่ม();
กระทู้.สลีป(100);
-
สำหรับ (int i = 0; i <TestThread.m_testThreads.Length; i ++)
-
TestThread.m_testThreads[i].เข้าร่วม();
-
Console.WriteLine("ทางออกของเธรดหลัก");
-
-
-
1. สองประโยคนี้ในฟังก์ชันหลักสามารถใช้แทนกันได้หรือไม่? ทำไม
TestThread.m_testThreads[i].เริ่ม();
Thread.Sleep(100);
2. สองประโยคนี้ในฟังก์ชัน CallBack สามารถใช้แทนกันได้หรือไม่ ทำไม ผลลัพธ์ที่แตกต่างจะเป็นอย่างไร?
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
3. ฟังก์ชั่นหลักสามารถเขียนแบบนี้ได้หรือไม่? ทำไม ผลลัพธ์ที่แตกต่างจะเป็นอย่างไร?
โมฆะสาธารณะคงที่ Main (String [] args)
-
Console.WriteLine("เริ่มเธรดหลัก");
สำหรับ (int i = 0; i <TestThread.m_testThreads.Length; i ++)
-
TestThread.m_threadIndex = ฉัน;
TestThread.m_testThreads[i] = เธรดใหม่ (ThreadStart ใหม่ (ThreadCallBack));
TestThread.m_testThreads[i].เริ่ม();
TestThread.m_testThreads[i].เข้าร่วม();
กระทู้.สลีป(100);
-
Console.WriteLine("ทางออกของเธรดหลัก");
-
4.ประโยคเหล่านี้มีหน้าที่อะไร? แล้วโปรแกรมยังมีปัญหาอะไรบ้าง? ควรทำการปรับเปลี่ยนอะไรบ้าง?
TestThread.m_Mutex.WaitOne();
int m_index = m_threadIndex;
TestThread.m_Mutex.ReleaseMutex();
สำหรับการเรียนรู้และการสนทนาเท่านั้น