c#线程同步使用详解示例

C#线程同步使用详解

什么是线程同步?

当多个线程同时访问共享资源时,可能会导致数据的不一致或错误。线程同步就是为了协调多个线程对共享资源的访问,以保证数据的准确性和一致性。

C#中的线程同步方式

C#中有以下几种线程同步方式:

  1. 互斥量(Mutex)
    在任意时刻,只有一个线程能占用互斥量所代表的共享资源。其他线程则需要等待,直到当前线程释放互斥量。

  2. 信号量(Semaphore)
    信号量限制了可以访问共享资源的线程数量。当线程需要访问共享资源时,需先获取信号量。信号量的值大于0时,表示有可用的资源;而信号量的值为0时,表示所有资源都已被占用,线程需要等待。

  3. 事件(Event)
    事件用于线程间的同步。一个线程通过事件触发另一个线程的执行。事件分为两种:手动重置事件和自动重置事件。

  4. 互斥锁(MutexLock)
    互斥锁与Mutex的使用方式相同,用于保护共享资源的访问。

示例1:使用Mutex实现线程同步

using System.Threading;

public class Program
{
    private static Mutex mutex = new Mutex();

    static void Main(string[] args)
    {
        Thread thread1 = new Thread(ThreadJob);
        Thread thread2 = new Thread(ThreadJob);

        thread1.Start();
        thread2.Start();

        thread1.Join();
        thread2.Join();

        Console.ReadKey();
    }

    static void ThreadJob()
    {
        mutex.WaitOne();
        Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "进入");
        Thread.Sleep(2000);
        Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "离开");
        mutex.ReleaseMutex();
    }
}

输出:

线程3进入
线程3离开
线程4进入
线程4离开

在这个示例中,我们使用Mutex对共享资源进行锁定。在进入关键代码段前,线程需要等待锁定的资源被释放。当线程完成任务后,需要释放占用的锁定资源,以允许其他线程访问。

示例2:使用Semaphore实现线程同步

using System.Threading;

public class Program
{
    private static Semaphore semaphore = new Semaphore(2, 3);

    static void Main(string[] args)
    {
        Thread[] threads = new Thread[6];
        for (int i = 0; i < threads.Length; i++)
        {
            threads[i] = new Thread(ThreadJob);
        }
        foreach (Thread thread in threads)
        {
            thread.Start();
        }
        foreach (Thread thread in threads)
        {
            thread.Join();
        }

        Console.ReadKey();
    }

    static void ThreadJob()
    {
        semaphore.WaitOne();
        Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "进入");
        Thread.Sleep(2000);
        Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "离开");
        semaphore.Release();
    }
}

输出:

线程3进入
线程4进入
线程3离开
线程4离开
线程5进入
线程5离开
线程6进入
线程6离开

在这个示例中,我们使用Semaphore限制了同时访问共享资源的线程数量。当信号量的值大于0时,线程可以访问共享资源;否则,线程需要等待。当线程完成任务后,需要释放信号量,以允许其他线程访问共享资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#线程同步使用详解示例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • ASP.NET 调用百度搜索引擎的代码

    ASP.NET 是微软公司推出的一款用于构建 Windows 网络应用程序的框架。它有着强大的功能和灵活的扩展性,在实际应用中得到了广泛的应用。本次攻略旨在介绍如何使用 ASP.NET 调用百度搜索引擎的 API 进行搜索,并提供两个示例说明。 1.准备工作 在使用百度搜索引擎的 API 前,需要先申请一个开发者账号并获取 API Key 和 Secret …

    C# 2023年5月31日
    00
  • 体验.NET与文件存储服务MinIO

    对象文件存储服务(OSS)主要用于存储零散的文件,和直接存储到本地文件系统中相比,有以下的几个优势: 跨服务器可用 兼容Amazon S3 API 横向扩容 高可用 支持加密 MinIO就是一个高性能的文件服务,我们使用.NET来操作一下。 部署MinIO 最简单的办法,就是在Docker上运行MinIO。可以使用以下命令启动MinIO: docker ru…

    C# 2023年4月24日
    00
  • System.Data.SQLite 数据库详细介绍

    System.Data.SQLite 数据库详细介绍 什么是System.Data.SQLite? System.Data.SQLite是.NET平台下开源的、基于SQLite的数据访问框架。它可以给.NET应用程序提供SQLite的数据库连接和操作能力,同时兼容ADO.NET的数据处理方式。 System.Data.SQLite安装及使用 安装 可以通过N…

    C# 2023年6月3日
    00
  • C#实现日期时间的格式化输出的示例详解

    C#实现日期时间的格式化输出的示例详解 在C#中,我们经常需要使用日期时间类型进行操作,而日期时间的输出格式化是常见的需求之一。本文将详细讲解如何使用C#实现日期时间的格式化输出。 日期时间输出格式化方法 在C#中,我们可以使用ToString()函数将日期时间格式化为指定的字符串。ToString()函数有多个重载形式,其中最常用的是将格式字符串作为参数的…

    C# 2023年6月1日
    00
  • C#实现单件模式的三种常用方法

    C#实现单件模式的三种常用方法 在设计模式中,单件模式(Singleton Pattern)是一种常用的创建型设计模式,它能够确保一个类只有一个实例,并提供全局的访问点。在C#中,实现单件模式的方法比较多,本文将介绍其中的三种常用方法。 方法一:饿汉式(静态初始化) 饿汉式是最简单、常用的实现单件模式的方式之一。它在类加载时就创建了实例,因此线程安全,但是会…

    C# 2023年6月7日
    00
  • C#字符串的截取函数用法总结

    下面是关于“C#字符串的截取函数用法总结”完整攻略的内容: 目录 介绍 SubString() 方法 Remove() 方法 示例说明 总结 介绍 在C#中,字符串截取是一种常见的操作。有许多方法可以截取 C# 字符串,其中最常用的是 SubString() 和 Remove() 方法。本文将对这两种方法进行详细的说明,并提供示例说明。 SubString(…

    C# 2023年6月8日
    00
  • C#+MO实现一个道路编辑软件(刚开始)

    C#+MO实现一个道路编辑软件(刚开始)攻略 确定项目需求和功能 在开发道路编辑软件前,需要明确该软件的具体需求和功能,例如: 用户能够创建、保存和加载地图 用户能够在地图上添加和编辑道路 用户能够选择道路的属性,如道路宽度、材质等 用户能够删除地图上的道路 用户能够将道路调整为符合交通要求的合法形状 用户能够导出地图数据到文件或数据库中 选择技术栈并搭建开…

    C# 2023年5月31日
    00
  • 正则表达式 学习资料整理

    正则表达式 学习资料整理 什么是正则表达式 正则表达式(Regular Expression)是一种用于描述文本模式的方法,通常用于在字符串中查找、匹配、替换文本,以及对文本进行分割等操作。 正则表达式是由元字符、字符集、重复限定符、分组和反向引用等构成的,可以通过使用这些元素,配合一定的语法规则,来编写适用于不同情况下的复杂的文本操作模式。 学习资料整理 …

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部