**
class ThreadLock
{
protected int mLockCount = 0;
public bool isLocked()
{
return mLockCount == 1;
}
public void waitForUnlock()
{
mLockCount = 1;
while(mLockCount != 0)
{
}
}
public void unlock()
{
mLockCount = 0;
}
}**
当时这样写了一个线程锁,并没有用c#中lock ,在运用的时候发现线程锁运行中会出现死锁的现象,一直很纠结,后面才知道对于多线程如果要是想要上面这种方式加锁,需要原子操作。
什么是原子操作?
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch
所以将代码进行稍微修改就可以实现多线程的线程锁了。
**
class ThreadLock
{
protected int mLockCount = 0;
public bool isLocked()
{
return mLockCount == 1;
}
public void waitForUnlock()
{
Interlocked.Exchange(ref mLockCount,1);
while(mLockCount != 0)
{
}
}
public void unlock()
{
Interlocked.Exchange(ref mLockCount, 0);
}
}**
// 互斥锁lock
// 注意锁对象应该是: 私有+静态+只读+引用类型的对象,这样可以防止外部改变锁对象。
//作用:将会锁住代码块的内容,并阻止其他线程进入该代码快,直到该代码快运行完成,释放该锁。
private static readonly object mObjLock = new object();
public void UseLock()
{
lock (mObjLock)
{
//todo
}
// 互斥锁Monitor
// 注意锁对象应该是: 私有+静态+只读+引用类型的对象,这样可以防止外部改变锁对象。
//作用:将会锁住代码块的内容,并阻止其他线程进入该代码快,直到该代码快运行完成,释放该锁。
private static readonly object mObjMonitorLock = new object();
public void UseMonitorLock()
{
Monitor.Enter(mObjMonitorLock);
//todo
Monitor.Exit(mObjMonitorLock);
//作用:将会锁住代码块的内容,并阻止其他线程进入该代码快,直到该代码快运行完成,释放该锁。
}
// 互斥锁Monitor
// 注意锁对象应该是: 私有+静态+只读+引用类型的对象,这样可以防止外部改变锁对象。
//作用:将会锁住代码块的内容,并阻止其他线程进入该代码快,直到该代码快运行完成,释放该锁。
private static readonly Mutex mObjMutexLock = new Mutex();
public void UseMutexLock()
{
mObjMutexLock.WaitOne();
//todo
mObjMutexLock.ReleaseMutex();
}