多线程共享一个进程的地址空间,虽然线程间通信容易进行,但是多线程同时访问共享对象时需要引入同步和互斥机制。
线程同步:多个任务按照约定的顺序相互配合完成一件事,基于信号量的概念提出了一种同步机制,由信号量来决定线程是继续运行还是阻塞等待。
线程互斥:线程间同步访问临界资源时的互相等待,引入互斥锁的目的是用来保证共享资源数据操作的完整性。互斥锁主要用来保护临界资源,每个临界资源都有一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。线程必须先获得互斥锁才能访问临界资源,访问玩临界资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。临界资源是指每次仅允许一个进程访问的资源,属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等,线程间应采取互斥方式,实现对这种资源的共享。每个线程中访问临界资源的那段代码称为临界区。
在C#中实现线程的同步有几种方法:lock、Mutex、Monitor、Semaphore、Interlocked和ReaderWriterLock等。同步策略也可以分为同步上下文、同步代码区、手动同步几种方式。
1、同步代码区
同步代码区,它是针对特定部分代码进行同步的一种方法。
(1)、lock同步, lock语句是一种有效的、不跨越多个方法的小代码块同步的做法,也就是使用lock语句只能在某个方法的部分代码之间,不能跨越方法。
参考程序:
public class ThreadTwo : MonoBehaviour
{
private Thread _trdOne;
private Thread _trdTwo;
private List<string> _slTricket = new List<string>();
private object _oLock = new object();
void Start ()
{
TricketList();
_trdOne = new Thread(new ThreadStart(Run));
_trdTwo = new Thread(new ThreadStart(Run));
_trdOne.Name = "trdOne";
_trdTwo.Name = "trdTwo";
_trdOne.Start();
_trdTwo.Start();
}
void Tricke