zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ASP.NET:一段比较经典的多线程学习代码

2023-06-13 09:13:42 时间

  一段比较经典的多线程学习代码。

  1、用到了多线程的同步问题。
  2、用到了多线程的顺序问题。

  如果有兴趣的请仔细阅读下面的代码。注意其中代码段的顺序,思考一下,这些代码的顺序能否互相调换,为什么?这应该对学习很有帮助的。为了演示,让所有的线程都Sleep了一段时间。

usingSystem.Net;
usingSystem;
usingSystem.IO;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Diagnostics;

namespaceWebb.Study
{
   classTestThread
   {
       staticMutexm_Mutex           =newMutex();
       staticThread[]m_testThreads   =newThread[10];
       staticintm_threadIndex       =0;

       staticvoidThreadCallBack()
       {
           TestThread.m_Mutex.WaitOne();
           intm_index   =m_threadIndex;
           TestThread.m_Mutex.ReleaseMutex();
           Console.WriteLine("Thread{0}start.",m_index);
           for(inti=0;i<=10;i++)
           {
               TestThread.m_Mutex.WaitOne();    
               Console.WriteLine("Thread{0}:isrunning.{1}",m_index,i);
               TestThread.m_Mutex.ReleaseMutex();
               Thread.Sleep(100);
           }
           Console.WriteLine("Thread{0}end.",m_index);
       }

       publicstaticvoidMain(String[]args)
       {
           Console.WriteLine("Mainthreadstart.");
           for(inti=0;i<TestThread.m_testThreads.Length;i++)
           {
               TestThread.m_threadIndex   =i;
               TestThread.m_testThreads[i]   =newThread(newThreadStart(ThreadCallBack));               
               TestThread.m_testThreads[i].Start();
               Thread.Sleep(100);
           }
           for(inti=0;i<TestThread.m_testThreads.Length;i++)
           {
               TestThread.m_testThreads[i].Join();
           }
           Console.WriteLine("Mainthreadexit.");
       }
   }
}

  1、主函数中这两句能否互换?为什么?

               TestThread.m_testThreads[i].Start();
               Thread.Sleep(100);

  2、CallBack函数中这两句能否互换?为什么?会有什么不同的结果?

               TestThread.m_Mutex.ReleaseMutex();
               Thread.Sleep(100);

  3、主函数能否写成这样?为什么?会有什么不同的结果?

       publicstaticvoidMain(String[]args)
       {
           Console.WriteLine("Mainthreadstart.");
           for(inti=0;i<TestThread.m_testThreads.Length;i++)
           {
               TestThread.m_threadIndex   =i;
               TestThread.m_testThreads[i]   =newThread(newThreadStart(ThreadCallBack));               
               TestThread.m_testThreads[i].Start();
               TestThread.m_testThreads[i].Join();
               Thread.Sleep(100);
           }
           Console.WriteLine("Mainthreadexit.");
       }

  4、这几句的作用是什么?那么程序中还存在什么样的问题?应该做怎样的修改?

  TestThread.m_Mutex.WaitOne();
  intm_index=m_threadIndex;
  TestThread.m_Mutex.ReleaseMutex();

仅做学习讨论。