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


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

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

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

    using System.Net;
    using System;
    using System.IO;
    using System.Text;
    using System.Threading;
    using System.Diagnostics;

    namespace Webb.Study
    {
        
    class TestThread
        
    {
            
    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(
    "Thread {0} start.",m_index);
                
    for(int i=0;i<=10;i++)
                

                    TestThread.m_Mutex.WaitOne();     
                    Console.WriteLine(
    "Thread {0}: is running. {1}",m_index,i);
                    TestThread.m_Mutex.ReleaseMutex();
                    Thread.Sleep(
    100);
                }

                Console.WriteLine(
    "Thread {0} end.",m_index);
            }


            
    public static void Main(String[] args)
            
    {
                Console.WriteLine(
    "Main thread start.");
                
    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(
    "Main thread exit.");
            }

        }

    }

    1、主函数中这两句能否互换?为什么?
                    TestThread.m_testThreads[i].Start();
                    Thread.Sleep(100);

    2、CallBack函数中这两句能否互换?为什么?会有什么不同的结果?
                    TestThread.m_Mutex.ReleaseMutex();
                    Thread.Sleep(100);

    3、主函数能否写成这样?为什么?会有什么不同的结果?
            public static void Main(String[] args)
            
    {
                Console.WriteLine(
    "Main thread start.");
                
    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(
    "Main thread exit.");
            }

    4、这几句的作用是什么?那么程序中还存在什么样的问题?应该做怎样的修改?
       TestThread.m_Mutex.WaitOne();
       int m_index = m_threadIndex;
       TestThread.m_Mutex.ReleaseMutex();

    仅做学习讨论。
  • 相关阅读:
    后台点赞 接口
    三表联查
    后台投票 接口
    MSXML insertBefore(IXMLDOMNode *newChild, VARIANT refChild) 传参
    WTL中菜单栏及工具栏项状态改变应注意的地方
    使用WTL的消息反射封装CEdit实现监听控件文本改变事件
    修改字体
    CEdit实现文本换行
    VC中获取窗口控件相对客户区的坐标
    关闭HTC手机充电时屏幕一直亮着绿色电池的办法
  • 原文地址:https://www.cnblogs.com/WuCountry/p/429649.html
Copyright © 2020-2023  润新知