كود تعليمي متعدد الخيوط كلاسيكي نسبيًا.
1. يتم استخدام مشكلة المزامنة متعددة الخيوط.
2. يتم استخدام مشكلة التسلسل للخيوط المتعددة.
إذا كنت مهتمًا، يرجى قراءة الكود أدناه بعناية. انتبه إلى ترتيب أجزاء الكود وفكر في الأمر، هل يمكن تبادل ترتيب هذه الرموز؟ يجب أن يكون هذا مفيدًا للتعلم. لأغراض العرض التوضيحي، دع جميع المواضيع تنام لفترة من الوقت.
باستخدام System.Net؛
باستخدام النظام؛
باستخدام System.IO؛
باستخدام System.Text؛
باستخدام System.Threading؛
باستخدام System.Diagnostics
مساحة الاسم Webb.Study
{
موضوع اختبار الطبقة
{
static 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("بدء الموضوع {0}.",m_index);
ل(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);
}
الفراغ الثابت العام الرئيسي (String[] args)
{
Console.WriteLine("بداية الموضوع الرئيسي.");
for(int i=0;i<TestThread.m_testThreads.Length;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.Length;i++)
{
TestThread.m_testThreads[i].Join();
}
Console.WriteLine("خروج الموضوع الرئيسي.");
}
}
}
1. هل يمكن تبادل هاتين الجملتين في الوظيفة الرئيسية؟ لماذا؟
TestThread.m_testThreads[i].Start();
Thread.Sleep(100);
2. هل يمكن تبادل هاتين الجملتين في وظيفة CallBack؟ لماذا؟ ماذا ستكون النتيجة المختلفة؟
TestThread.m_Mutex.ReleaseMutex();
Thread.Sleep(100);
3. هل يمكن كتابة الوظيفة الرئيسية بهذه الطريقة؟ لماذا؟ ماذا ستكون النتيجة المختلفة؟
الفراغ العام الثابت الرئيسي (سلسلة [] الحجج)
{
Console.WriteLine("بداية الموضوع الرئيسي.");
for(int i=0;i<TestThread.m_testThreads.Length;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();
فقط للتعلم والمناقشة.