C# 多线程编程 经典模型 生产者和消费者问题

语言:C#

 

总起:

在编写Unity程序的时候一般不用考虑到多线程的问题,但了解经典的三个问题对以后编写多线程会有所帮助,嘛,主要是好奇就研究看看。

 

多线程的两个主要的对象是Mutex互斥体和Semaphore信号量,当然现在语言都提供类似lock的关键字使用更加方便。不过既然C#提供了这样的实现,我还是以这两个对象作为展开。

 

Mutex互斥体和Semaphore信号量:

首先说明一下Mutex和Semaphore是内核级别的,对性能影响较大,而lock是基于Monitor的,所以普通情况下还是尽量使用lock。

 

♦ Mutex

互斥体可以让一段代码运行时只有一个线程占有,保证一个操作的原子性。

 

Mutex.WaitOne 尝试获取进入权限,如果已经有线程进入则等待,没有则进入后锁住;

 

Mutex.ReleaseMutex 释放权限。

 

♦ Semaphore

信号量其实和互斥体差不多,只不过它的内部使用int计数,比如说为5,相当于有5把钥匙,那么就是来一个线程就会取走一个,离开一个线程则会释放一个。如果碰到为0的情况,就需要等待。

 

只有0和1两种情况时其实就是互斥体。

 

Semaphore.WaitOne 尝试获取一份进入的权限;

 

Semaphore.Release 释放一份进入权限。

 

生产者和消费者的问题:

生产者生产物品放到一个Buffer中,由消费者从Buffer中取出物品并消费,从中产生的同步问题是最经典的一个同步模型(Web中从SQL中查改数据其实就是该问题)。

 

首先我们准备好数据和方法:

class Item
{
    public string name = "一个产
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值