专栏首页Unity TechnologyJtro的技术分享:c#中的线程互斥

Jtro的技术分享:c#中的线程互斥

通过多线程,c#能够并行执行代码。每一个线程都有它独立的执行路径,所有的线程都能够访问共有的变量。下面的例子说明这个问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using System.Threading;
using System.Threading.Tasks;

namespace ThresdScript
{
    class MainClass
    {
        static string str = "";
        static void Main(string[] args)
        {
            Thread t1 = new Thread(Add1);
            t1.Start();
            Thread t2 = new Thread(Add2);
            t2.Start();
            //等待一段时间
            Thread.Sleep(1000);
            Console.WriteLine( str );
            Console.ReadKey();
        }
        //线程1
        public static void Add1()
        {
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(10);
                str += 'a';
            }
        }
        //线程2
        public static void Add2()
        {
            for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    Thread.Sleep(10);
                    str += 'b';
                }
            }
        }
    }
}

由于两个线程并行执行,字符串str时而被Add1操作,时而被Add2操作,所以打印如下结果:

线程互斥.png

为了避免线程竞争,可以通过加锁的方式(Lock)来处理,当2个线程争夺一个锁的时候,只能有一个线程有资格获取,另一个挂起等待。一直等到可用为止,这种情况,保证在同一时刻只有一个线程能进入临界区。程序改为下面的状态:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using System.Threading;
using System.Threading.Tasks;

namespace ThresdScript
{
    class MainClass
    {
        static string str = "";
        static void Main(string[] args)
        {
            Thread t1 = new Thread(Add1);
            t1.Start();
            Thread t2 = new Thread(Add2);
            t2.Start();
            //等待一段时间
            Thread.Sleep(1000);
            Console.WriteLine( str );
            Console.ReadKey();
        }
        //线程1
        public static void Add1()
        {
            lock (str)
            {
                for (int i = 0; i < 20; i++)
                {
                    Thread.Sleep(10);
                    str += 'a';
                }
            }
        }
        //线程2
        public static void Add2()
        {
            lock (str)
            {
                for (int i = 0; i < 20; i++)
                {
                    Thread.Sleep(10);
                    str += 'b';
                }
            }
        }
    }
}

运行后的2种情况:

第一种.png

第二种.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jtro的技术分享:游戏客户端与服务器(c#)通讯_同步Socket

    在游戏界,独立游戏层出不穷,但是大部分都是单机,网络游戏很少,因为不会有独立开发者自己整一个服务器,除非你先去买个虚拟服务器。网络通讯一直是一个很大的学术,今天...

    LittleU
  • Blender优秀插件MB-Lab的汉化

    BLENDER是一款开源免费的多平台全能三维动画制作软件.里面的插件大部分都是用python编写.

    LittleU
  • Jtro的技术分享:MVC框架

    MVC框架历史悠久了,具体多久我也不知道,但是在游戏开发中的UI 使用太普遍了,最近我的一个徒弟跟我抱怨说网上的mvc框架晦涩难懂,看了一下午看不出所以然来,我...

    LittleU
  • 使用MVC实现登录功能

                      using System.Data.SqlClient;

    wfaceboss
  • Java的线程创建方式总结与父线程概念

    父线程的概念是我在翻阅Java-jdk1.8代码的时候看到的,父线程概念第一次是在Thread类的Init方法中提到的,其中g是ThreadGroup类定义的对...

    Fisherman渔夫
  • Java入门 - 高级教程 - 07.多线程

    原文地址:http://www.work100.net/training/java-multi-threading.html

    光束云
  • Java线程池扩展之关联线程池与业务

    Java API针对不同需求,利用Executors类提供了4种不同的线程池:newCachedThreadPool, newFixedThreadPool, ...

    九州暮云
  • [技术地图] Preact

    React 的代码库现在已经比较庞大了,加上 v16 的 Fiber 重构,初学者很容易陷入细节的汪洋大海,搞懂了会让人觉得自己很牛逼,搞不懂很容易让人失去信心...

    _sx_
  • 什么是线程安全,以及并发需要知道的几个概念

    众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。为了追求成为一个好的Java...

    Debian中国
  • Android 面试必备 - 线程

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:

    用户2965908

扫码关注云+社区

领取腾讯云代金券