知识大全 C#多线程中lock的用法

Posted 操作

篇首语:鸟欲高飞先振翅,人求上进先读书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#多线程中lock的用法相关的知识,希望对你有一定的参考价值。

C#多线程中lock的用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  经常碰到同时需要对某个数据进行操作 或者对某个文件进行读写操作 对于这些操作我们以前往往不能很好的进行处理 自从C#语言中引入了lock这个关键字 以上问题就比较容易予以解决了 下面就是一段简单的代码

public class AccessControl()    private static object privateObjectLock = new object();  public static AccessResult()     lock(privateObjectLock)    //数据操作语句      

  在做邮箱接收网关的时候遇到了以下的需求 要求为每一个邮箱开启一个接收线程 从POP 服务器上收取 然后将邮件存放到统一的FTP服务器上 要求邮件按收接顺充从 开始顺充编号

  我实现的方法为 为每个邮箱new出实例 然后分别赋给POP 邮箱地址 用户名 密码等参数 这里涉及到一个编号同步的问题 因为每个接收邮件的线程都是自己执行 所以取得编号并且递增这个动作是互斥的

  以一个静态变量表示编号如下

  class EmailInfo    public static int CurrentNumber;  

  那在当前线程取得这个步骤为

CurrentNumber=++EmailInfo CurrentNumber;

  虽然此为一句 但在计算机运行时却分为多步 如下

  EmialInfo CurrentNumber加 EmailInfo CurrentNumber返回值给_CurrentNumber 也许线程 执行了EmailInfo CurrentNumber加 的操作 但还没有取得返回值 此时线程 又执行了EmailInfo CurrentNumber加 的操作 然后又线程 线程 取得了返回值就是一样的 这样就失去了按顺序递增的作用

  此时查找了网上有关线程同步的方法 其实用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;   cha138/Article/program/net/201311/15429

相关参考