C#多线程及同步示例简析

C#多线程及同步示例简析

在C#中,多线程编程可以提高CPU利用率,提高程序的响应速度,增强程序的稳定性。但多线程编程中也会遇到诸多问题,比如线程安全、死锁、优先级等问题,需要进行同步和协同操作。本文将从多线程编程和同步操作两个方面进行简要分析,并提供两个实例来加深读者的理解。

多线程编程示例

示例一:简单的启动线程和等待线程结束

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        Thread thread = new Thread(Worker);
        thread.Start();
        Console.WriteLine("主线程开始等待工作线程结束");
        thread.Join();
        Console.WriteLine("工作线程已结束");
    }

    static void Worker()
    {
        Console.WriteLine("工作线程正在工作...");
        Thread.Sleep(5000); // 模拟一些工作
        Console.WriteLine("工作线程已结束");
    }
}

上述示例中,通过创建Worker方法的线程,来模拟一些耗时的工作,而主线程则在启动此线程之后,等待线程结束,再继续执行代码。

示例二:线程安全的计数器

using System;
using System.Threading;

class Program
{
    static volatile int count = 0; // volatile确保写操作的可见性

    static void Main(string[] args)
    {
        Thread[] threads = new Thread[10];
        for (int i = 0; i < threads.Length; i++)
        {
            threads[i] = new Thread(Worker);
            threads[i].Start();
        }
        foreach (Thread thread in threads) thread.Join(); // 等待所有线程结束
        Console.WriteLine("计数器结果: " + count);
    }

    static void Worker()
    {
        for (int i = 0; i < 100000; i++) Interlocked.Increment(ref count); // 加锁保证访问安全
    }
}

上述示例中,创建10个线程,每个线程都会执行100000次的计数操作。由于多个线程可能会同时对计数器进行修改,会导致数据不一致或者程序崩溃等问题。因此,在每次修改计数器时,需要使用加锁保证访问的安全性。同时使用volatile关键字,确保写操作的可见性。

同步示例

示例一:互斥锁

using System;
using System.Threading;

class Program
{
    static bool stop = false;
    static Mutex mutex = new Mutex();

    static void Main(string[] args)
    {
        Thread thread1 = new Thread(Worker1);
        Thread thread2 = new Thread(Worker2);
        thread1.Start();
        thread2.Start();
        Console.ReadKey();
        stop = true;
    }

    static void Worker1()
    {
        while (!stop)
        {
            mutex.WaitOne();
            Console.WriteLine("Worker1正在工作...");
            Thread.Sleep(100);
            mutex.ReleaseMutex();
        }
        Console.WriteLine("Worker1已停止");
    }

    static void Worker2()
    {
        while (!stop)
        {
            mutex.WaitOne();
            Console.WriteLine("Worker2正在工作...");
            Thread.Sleep(200);
            mutex.ReleaseMutex();
        }
        Console.WriteLine("Worker2已停止");
    }
}

上述示例中,使用Mutex类来创建一个互斥锁,确保同一时刻只有一个线程能够访问共享资源。Worker1和Worker2线程会多次等待互斥锁,并分别对共享资源进行访问。

示例二:信号量

using System;
using System.Threading;

class Program
{
    static Semaphore sem = new Semaphore(2, 2); // 初始信号量为2,最大信号量为2

    static void Main(string[] args)
    {
        for (int i = 1; i <= 5; i++)
        {
            Thread thread = new Thread(Worker);
            thread.Name = "Worker" + i;
            thread.Start();
        }
        Console.ReadKey();
    }

    static void Worker()
    {
        Console.WriteLine(Thread.CurrentThread.Name + "等待信号量");
        sem.WaitOne(); //等待信号量
        Console.WriteLine(Thread.CurrentThread.Name + "开始工作");
        Thread.Sleep(2000);
        Console.WriteLine(Thread.CurrentThread.Name + "结束工作");
        sem.Release(); // 释放信号量
    }
}

上述示例中,使用Semaphore类来表示一个具有初始信号量的信号灯。多个Worker线程会在开始之前等待信号灯,只有在获得信号之后才能开始工作。在工作结束之后会释放信号灯。

总结

本文介绍了C#多线程编程和同步操作的相关知识,并提供了两个示例来帮助读者更好地理解。在实际应用中,多线程和同步操作需要结合具体业务场景进行设计和调整,以达到最优的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程及同步示例简析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 在scrollView中使用pageControl

    在scrollView中使用pageControl的完整攻略 在iOS开发中,scrollView是一个常用的控件,用于显示大量内容。而pageControl则是一个用于指示scrollView当前页数的控件。本文将为您提供一份详细的在scrollView中使用pageControl的完整攻略,包括基本概念、使用方法和两个示例说明。 基本概念 在iOS中,s…

    other 2023年5月5日
    00
  • 导致Mac变卡顿的凶手有哪些?11种可能导致mac卡顿的原因分析

    下面我将详细讲解“导致Mac变卡顿的凶手有哪些?11种可能导致mac卡顿的原因分析”的完整攻略。 导致Mac变卡顿的凶手有哪些?11种可能导致mac卡顿的原因分析 1. 运行过多的程序 如果您有太多的应用程序正在同时运行,那么您的Mac电脑可能会变得缓慢。因此,请关闭您不需要的应用程序来释放RAM和CPU资源。 2. 太多的工作空间 如果您在Mac电脑上开了…

    other 2023年6月27日
    00
  • Vue 2.0 服务端渲染入门介绍

    Vue 2.0 服务端渲染入门介绍 什么是服务端渲染 在传统的前端Web开发中,页面的渲染都是由浏览器进行的,也就是称作客户端渲染。当浏览器请求服务器时,服务器会将页面和静态资源一起打包成HTML、CSS和JavaScript文件,返回给浏览器进行展示。 而服务端渲染则是指在服务器端生成HTML页面,再将其返回给浏览器。这种方式可以加速首屏加载速度,提升SE…

    other 2023年6月27日
    00
  • win7_32下编译FFmpeg

    win7_32下编译FFmpeg的完整攻略 本文将为您详细讲解如何在win7_32下编译FFmpeg,包括环境搭建、源码下载、编译配置、编译过程和示例说明等步骤。 环境搭建 在开始编译FFmpeg之前,需要先在win7_32系统中安装MinGW和MSYS。可以按照以下步骤进行操作: 下载MinGW安装包,安装MinGW到C:\MinGW目录下。 下载MSYS…

    other 2023年5月6日
    00
  • linux mount命令的用法详细解析

    Linux mount命令的用法详细解析 在 Linux 系统中,mount 命令最为常用和实用,它是将一个存储设备(如磁盘分区、U盘等)挂载到系统中的指定目录下使用的命令。本文将详细讲解 mount 命令的用法,以及如何挂载和卸载存储设备。 语法格式 mount的语法格式如下: mount [-fnrsvw] [-t<类型>] [-o<选…

    other 2023年6月27日
    00
  • centos查看运行服务

    当然,我很乐意为您提供CentOS查看运行服务的攻略。以下是详细的步骤和示例: 步骤1:登录到CentOS服务器 首先,您需要登录到CentOS服务器。您可以使用SSH客户端连接到服务器,或者在服务器本地终端中登录。 步骤2:使用systemctl命令查看运行服务 CentOS使用systemctl命令来管理系统服务。您可以使用systemctl命令来查看当…

    other 2023年5月6日
    00
  • Nmap 简单功能介绍

    Nmap 简单功能介绍 Nmap是一个用于网络探测和安全审计的免费工具,可以帮助管理员识别可能存在的安全问题并进行解决。 下面我们来简单介绍一下Nmap的一些基础功能: 主机发现 主机扫描可以让用户发现当前局域网中的活动主机,同时识别该主机所使用的操作系统和开放的端口。下面是使用 Nmap 进行主机探测的命令示例: nmap -sP 192.168.0.0/…

    其他 2023年3月28日
    00
  • [下载]Android M开发者预览版镜像下载 支持4款Nexus

    下载Android M开发者预览版镜像下载 支持4款Nexus设备 Android M开发者预览版目前只支持以下4款Nexus设备: Nexus 5 Nexus 6 Nexus 9 Nexus Player 下载步骤 以下是下载Android M开发者预览版镜像的详细步骤: 在官方下载页面选择您的设备:https://developer.android.co…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部