多线程中的线程锁

**

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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值