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


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

    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();

    仅做学习讨论。
  • 相关阅读:
    [置顶] Docker学习总结(3)——Docker实战之入门以及Dockerfile(三)
    [置顶] Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)
    Vue-Router中History模式【华为云分享】
    Linux系统通过FTP进行文档基本操作【华为云分享】
    窥探日志的秘密【华为云分享】
    弹性负载均衡:负载无限,均衡有道【华为云分享】
    不给糖果就捣乱,用Python绘制有趣的万圣节南瓜怪【华为云分享】
    机器学习笔记(八)---- 神经网络【华为云分享】
    还在为运维烦恼?体验云上运维服务,提意见赢好礼!【华为云分享】
    Vue+ElementUI项目使用webpack输出MPA【华为云分享】
  • 原文地址:https://www.cnblogs.com/WuCountry/p/429649.html
Copyright © 2020-2023  润新知