.Net多线程Threading相关详解

一、线程不安全例子

计数

cs 复制代码
const int total = 100_000;

int count = 0;

var thread1 = new Thread(Increment);
var thread2 = new Thread(Increment);

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

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

Console.WriteLine($"Count: {count}");

void Increment()
{
    for (int i = 0; i < total; i++)
        count++;
}

操作队列

cs 复制代码
var queue = new Queue<int>();

var producer = new Thread(Producer);
var consumer1 = new Thread(Consumer);
var consumer2 = new Thread(Consumer);

producer.Start();
consumer1.Start();
consumer2.Start();

producer.Join();
Thread.Sleep(100); // Wait for consumers to finish

consumer1.Interrupt();
consumer2.Interrupt();
consumer1.Join();
consumer2.Join();

void Producer()
{
    for (int i = 0; i < 20; i++)
    {
        Thread.Sleep(20);
        queue.Enqueue(i);
    }
}

void Consumer()
{
    try
    {
        while (true)
        {
            if (queue.TryDequeue(out var res))
                Console.WriteLine(res);
            Thread.Sleep(1);
        }
    }
    catch (ThreadInterruptedException)
    {
        Console.WriteLine("Thread interrupted.");
    }
}

二、Parallel与PLINQ

cs 复制代码
var inputs = Enumerable.Range(1,20).ToArray();

int HeavyJob(int input)
{
    Thread.Sleep(300);
    return input;
}

// Sequential
var forOutputs = new int[inputs.Length];
for (int i = 0; i < inputs.Length; i++)
{
    forOutputs[i] = HeavyJob(inputs[i]);
}

// Parallel
var parallelOutputs = new int[inputs.Length];
Parallel.For(0, inputs.Length, i =>
{
    parallelOutputs[i] = HeavyJob(inputs[i]);
});

// PLINQ
var plinqOutputs = inputs.AsParallel().Select(HeavyJob).ToArray();

三、PLINQ 与信号量

cs 复制代码
using System.Diagnostics;

var inputs = Enumerable.Range(1,20).ToArray();
var semaphore = new Semaphore(3, 3);

int HeavyJob(int input)
{
    semaphore.WaitOne();
    Thread.Sleep(300);
    semaphore.Release();
    return input;
}

var sw = Stopwatch.StartNew();
var plinqOutputs = inputs.AsParallel().Select(HeavyJob).ToArray();
sw.Stop();
Console.WriteLine($"Elapsed time: {sw.ElapsedMilliseconds}ms");

四、线程终止

cs 复制代码
//线程终止
var thread = new Thread(() =>
{
    try
    {
        for (int i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
            Console.WriteLine("Sub thread: " + i);
        }
    }
    catch (ThreadInterruptedException)
    {
        Console.WriteLine("Thread interrupted");
    }
});

thread.Start();
Thread.Sleep(3500);
thread.Interrupt();
thread.Join();
Console.WriteLine("Done");
相关推荐
2401_8795034111 小时前
C++中的状态模式实战
开发语言·c++·算法
@PHARAOH11 小时前
HOW - Go 开发入门(四)- ORM 对象关系映射
开发语言·后端·golang
Aawy12011 小时前
自定义字面量实战
开发语言·c++·算法
Red丶哞11 小时前
RustFS 使用 S3 Python SDK(Boto3)文档
开发语言·python
面对疾风叭!哈撒给11 小时前
Linux之Docker使用JDK21安装包制作JDK21镜像包
java·linux·运维·docker
计算机学姐11 小时前
基于SpringBoot的汽车美容保养系统
java·spring boot·后端·spring·tomcat·汽车·mybatis
铁打的阿秀11 小时前
Java 打印pdf添加水印实现
java·python·pdf
爱吃山竹的大肚肚11 小时前
依赖冲突快速解决
java·spring boot·后端·spring cloud·maven
得物技术11 小时前
大禹平台:流批一体离线Dump平台的设计与应用|得物技术
java·后端·算法
RisunJan11 小时前
Linux命令-mail (发送和接收电子邮件)
linux·服务器