|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。在使用程序中利用多个线程的一个优点是每一个线程都能够异步实行。关于Windows使用程序,耗时的义务能够在背景实行,而使使用程序窗口和控件坚持呼应。关于服务器使用程序,多线程处置供应了用分歧线程处置每一个传进哀求的才能。不然,在完整满意前一个哀求之前,将没法处置每一个新哀求。但是,线程的异步特征意味着必需和谐对资本(如文件句柄、收集毗连和内存)的会见。不然,两个或更多的线程大概在统一工夫会见不异的资本,而每一个线程都不晓得其他线程的操纵。了局将发生不成预知的数据破坏。
让我们先来看一片java的例子:多线程未同步大概招致的成绩及其办理计划
上面是C#的代码
transfer办法
publicvoidtransfer(intfrom,intto,doubleamount){
if(accounts[from]<amount)return;
Console.WriteLine(System.Threading.Thread.CurrentThread.Name);
accounts[from]-=amount;
Console.WriteLine("{0:F2}from{1}to{2}",amount,from,to);
accounts[to]+=amount;
Console.WriteLine("TotalBalance:{0:F2}",getTotalBalance());
}run办法
publicvoidrun(){
Randomrand;
try{
while(true){
rand=newRandom();
inttoAccount=rand.Next(bank.size);
doubleamount=rand.NextDouble()*maxAmount;
bank.transfer(fromAccount,toAccount,amount);
System.Threading.Thread.Sleep(rand.Next(DELY));
}
}
catch{}
}
这个成绩在.net中一样存在,关于.net有上面几中办理计划能够确保平安的实行多线程处置:
1)lock关头字
2)监督器
3)同步事务和守候句柄
4)Mutex工具
这里我们只说一下利用lock关头字,假如必要更多信息,请会见msdn:
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/413e1f28-a2c5-4eec-8338-aa43e7982ff4.htm
lock关头字能够用来确保代码块完成运转,而不会被其他线程中止。这是经由过程在代码块运转时代为给定工具猎取互斥锁来完成的。
lock语句以关头字lock开首,它有一个作为参数的工具,在该参数的前面另有一个一次只能由一个线程实行的代码块。比方:
publicvoidFunction()
{
System.ObjectlockThis=newSystem.Object();
lock(lockThis)
{
//Accessthread-sensitiveresources.
}
}
修正run办法
publicvoidrun(){
Randomrand;
try{
while(true){
lock(bank){
rand=newRandom();
inttoAccount=rand.Next(bank.size);
doubleamount=rand.NextDouble()*maxAmount;
bank.transfer(fromAccount,toAccount,amount);
System.Threading.Thread.Sleep(rand.Next(DELY));
}
}
}
catch{}
}利用lock关头字锁住了bank工具的实例,lock确保当一个线程位于代码的临界区时,另外一个线程不进进临界区。假如其他线程试图进进锁定的代码,则它将一向守候(即被制止),直到该工具被开释.
这里利用lock必要注重的是:
应制止锁定public范例,不然实例将超越代码的把持局限。罕见的布局lock(this)、lock(typeof(MyType))和lock("myLock")违背此原则:
1.假如实例能够被大众会见,将呈现lock(this)成绩。
2.假如MyType能够被大众会见,将呈现lock(typeof(MyType))成绩
3.因为历程中利用统一字符串的任何其他代码将共享统一个锁,以是呈现lock(“myLock”)成绩.
就我团体而言,我以为多线程假如要会见共享数据必需同步
简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而java是公开了。 |
|