| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2316 人关注过本帖
标题:多线程中调用静态方法的问题.
只看楼主 加入收藏
changjie
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-4-18
结帖率:100%
收藏
 问题点数:0 回复次数:3 
多线程中调用静态方法的问题.

class MessageCenter
{
static UserCollection Users=new UserCollection()
static DataTime _his;

public static MessageProcessor(ClientContent content)
{

if(DataTime.now>=_his.addMM(2)) // 问题1??
{
_his=DataTime.now;

//在这里做整理用户集合的事情.
}

switch(content.head)
{
case "onli":
break;
case "ofli":
break;

}
}
}


这个静态方法会被很多线程调用。

比如:
Thread t1=new Thread(new ThreadStart(work))
Thread t2=new Thread(new ThreadStart(work))
Thread t3=new Thread(new ThreadStart(work))
..... 等会很多。
void work()
{
while(true)
{
ClientContent c=new ClientContent()
MessageCenter.MessageProcessor(c) //A

Thread.sleep(2000);

}
}

这里模防每个线程会5秒钟调用//A这静太方法。

问题1?
目的:
不管是谁在调用这个静太方法,当他发现,现在的时间_his大于2分钟后,
就在自己的线程内,维护这个用户队列,也就是整理一次Users,其他都不用了。

我上面的方法显然是不行的,可能会发生几个线程同时进入,都去做这个维护工作
经过测试的确如此。
我断定问题是发生在这句子if(DataTime.now>=_his.addMM(2)) 当一个线程得到真结果后
还没有 _his=DataTime.now; 重新设置这个值。
另外一个线程己经也得到了if(DataTime.now>=_his.addMM(2))的true结果。


代码改进
class MessageCenter
{
static UserCollection Users=new UserCollection()
static DataTime _his;
static object lo=new object();

public static MessageProcessor(ClientContent content)
{

lock(lo)
{
if(DataTime.now>=_his.addMM(2)) // 问题1??
{
_his=DataTime.now;

//在这里做整理用户集合的事情.
}
}

switch(content.head)
{
case "onli":
break;
case "ofli":
break;

}
}
}

现求更高效的做法。

搜索更多相关主题的帖子: 线程 静态 
2007-10-09 19:18
没有注册
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-8-16
收藏
得分:0 
if(DataTime.now>=_his.addMM(2))
这玩意哪里会true


static DataTime _his; 一直是个default datetime
2007-10-10 10:07
changjie
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-4-18
收藏
得分:0 

这里只是用来描述这个问题,不是实际运行的代码.

目的:
不管是谁在调用这个静太方法,当他发现,现在的时间 比_his大2分钟后,
就在自己的线程内,维护这个用户队列,也就是整理一次Users,其他都不用了。

这才是目的

2007-10-10 10:35
没有注册
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-8-16
收藏
得分:0 
尽管 mutex 可以用于进程内的线程同步,但是使用 Monitor 通常更为可取,因为监视器是专门为 .NET Framework 而设计的,因而它可以更好地利用资源


使用 lock 关键字通常比直接使用 Monitor 类更可取,一方面是因为 lock 更简洁,另一方面是因为 lock 确保了即使受保护的代码引发异常,也可以释放基础监视器。这是通过 finally 关键字来实现的,无论是否引发异常它都执行关联的代码块


所以,用lock已经很好了


或者你使用实例对象 不要共用变量
2007-10-10 11:01
快速回复:多线程中调用静态方法的问题.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011538 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved