zoukankan      html  css  js  c++  java
  • 一段比较经典的多线程学习代码

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

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

    仅做学习讨论。
  • 相关阅读:
    PPP点对点协议
    Wireshark包过滤
    asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦
    sql学习笔记(三)—— 联表查询
    Sql学习笔记(二)—— 条件查询
    bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 ——中位数排序
    汕头市队赛 SRM19 字符题
    bzoj 2037: [Sdoi2008]Sue的小球——dp
    bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
    【BZOJ】3302: [Shoi2005]树的双中心 && 2103: Fire 消防站 && 2447: 消防站
  • 原文地址:https://www.cnblogs.com/WuCountry/p/429649.html
Copyright © 2011-2022 走看看