互斥是多处理器程序设计中最常见的一种协作方式。我们将某一资源放入临界区内:某个时刻仅能被一个线程执行,称这样的特征为互斥。实现互斥的标准方法就是采用一个具有以下接口的ILock对象。
一个线程若执行了setlock()方法调用,则称该线程获得一个锁(或称上锁);若执行了unlock()方法调用,则称该线程释放这个锁(或称开锁)。上面共享计数器的实现中,就是使用ILock域来保证对象的互斥特性。线程必须按照指定的方式调用setlock()和unlock()。如果一个线程满足下列条件,则称它是良构的:
1.一个临界区只和一个唯一的ILock对象相关联。
2.线程准备进入临界区时调用该对象的setlock()方法。
3.当线程离开临界区时调用unlock()方法。
public interface ILock
{
void setlock();
void unlock();
}
public class Counter
{
private int _value;
private ILock _lock;
public int getAndIncrement()
{
_lock.setlock();
try
{
int temp = _value;
_value = temp + 1;
return _value;
}
finally
{
_lock.unlock();
}
}
}
{
void setlock();
void unlock();
}
public class Counter
{
private int _value;
private ILock _lock;
public int getAndIncrement()
{
_lock.setlock();
try
{
int temp = _value;
_value = temp + 1;
return _value;
}
finally
{
_lock.unlock();
}
}
}
一个线程若执行了setlock()方法调用,则称该线程获得一个锁(或称上锁);若执行了unlock()方法调用,则称该线程释放这个锁(或称开锁)。上面共享计数器的实现中,就是使用ILock域来保证对象的互斥特性。线程必须按照指定的方式调用setlock()和unlock()。如果一个线程满足下列条件,则称它是良构的:
1.一个临界区只和一个唯一的ILock对象相关联。
2.线程准备进入临界区时调用该对象的setlock()方法。
3.当线程离开临界区时调用unlock()方法。