机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4878|回复: 2
打印 上一主题 下一主题

C#多线程中lock的用法详解

[复制链接]
跳转到指定楼层
楼主
发表于 2011-8-23 19:03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于这些操作我们以前往往不能很好的进行处理,自从C#语言中引入了lock这个关键字,以上问题就比较容易予以解决了,下面就是一段简单的代码。
public class AccessControl()
  {
  private static object privateObjectLock = new object();
  public static AccessResult()
   {
  lock(privateObjectLock)
  {
  //数据操作语句
  }
  }
  }
  在做邮箱接收网关的时候遇到了以下的需求,要求为每一个邮箱开启一个接收线程,从POP3服务器上收取,然后将邮件存放到统一的FTP服务器上,要求邮件按收接收顺序从1开始顺序编号。
  我实现的方法为,为每个邮箱new出实例,然后分别赋给POP3邮箱地址,用户名,密码等参数。这里涉及到一个编号同步的问题,因为每个接收邮件的线程都是自己执行,所以取得编号并且递增这个动作是不大现实的。
  以一个静态变量表示编号如下
  class EmailInfo
  {
  public static int CurrentNumber;
  }
  那在当前线程取得这个步骤为
_CurrentNumber=++EmailInfo.CurrentNumber;
  虽然此为一句,但在计算机运行时却分为多步,如下
  EmialInfo.CurrentNumber加1然后将EmailInfo.CurrentNumber的值给_CurrentNumber,也许线程1只执行了EmailInfo.CurrentNumber的加1 操作就用完了本次的CPU时间片,但此时还没有加1后的值赋给_CurrentNumber,此时线程2又执行了EmailInfo.CurrentNumber加1的操作,然后将CPU时间片又给了线程1,结果线程1,线程2取得的返回值就是一样的,这样就不能完成按顺序递增的任务。
  此时查找了网上有关线程同步的方法,其实用lock语句锁住递增的那一段即可。而介绍的相关用法为
  lock(this)
  {
  _CurrentNumber=++EmailInfo.CurrentNumber;
  }
  本以为这样就可以成功,谁知道还是无效,反复查找才发现没弄清楚lock的用法。因为网上所讲的资料,举的例子比较简单,是直接new 出一个对像,然后为对像的一个函数创建了多个线程运行,所以它的同步只要lock住this即它自己就行了。因为此时只有一个实例在运行,而我是new 出了多个对像(实例),lock住每个自己的实例所以当然无效。
  所以自然想了一个解决方法,就lock住相同的一个实例就行了。
  因为我每个邮件接收线程的参数都是不同的,所以还是new出几个实像,但lock的方法改为如下
  先为EmailInfo加一个静态变量
  class EmailInfo
  {
  public static object syncRoot = new object();
  public static int CurrentNumber;
  }
  然后lock改为
  lock(EmailInfo.syncRoot)
  {
  _CurrentNumber=++EmailInfo.CurrentNumber;
  }
  即可实现想要的效果了。

引用:http://tech.it168.com/a2009/0313/268/000000268475.shtml
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

沙发
发表于 2011-8-24 22:12:17 | 只看该作者
Linux中除了进程锁,数据锁之外还有指定位置的字节锁...读写文件时锁住某段字节。

锁在调试的时候可麻烦了...
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2011-8-25 10:29:17 | 只看该作者
xmubingo 发表于 2011-8-24 22:12
Linux中除了进程锁,数据锁之外还有指定位置的字节锁...读写文件时锁住某段字节。

锁在调试的时候可麻烦 ...

Linux数据单位分的很细啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-5-19 16:03 , Processed in 0.065603 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表