语言: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 = "一个产