快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

和记娱乐登录:C多线程中lock的用法



近来在看些c#的代码,发明很多是曩昔没有打仗到了,只能上网查,把对照好的收拾下来。

常常碰着同时必要对某个数据进行操作,或者对某个文件进行读写操作,对付这些操作我们曩昔每每不能很好的进行处置惩罚,自从和记娱乐登录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=++Email和记娱乐登录Info.CurrentNumber;

虽然此为一句,但在谋略机运行时却分为多步,如下

EmialInfo.CurrentNumber加1--EmailInfo.CurrentNumber返回值给_CurrentNumber

,大概线程1履行了EmailInfo.CurrentNumber加1 的操作,但还没有取得返回值,此时线程2又履行了EmailInfo.CurrentNumber加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=++Emai和记娱乐登录lInfo.CurrentNumber;

}

即可实现想要的效果了。

您可能还会对下面的文章感兴趣: