代码 class Program
{
public static Model m;
static void Main(string[] args)
{
System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();
ThreadStart ts = new ThreadStart(js);
ThreadStart ts2 = new ThreadStart(js);
Thread t1 = new Thread(ts);
Thread t2 = new Thread(ts2);
stop.Reset();
m = new Model();
m.i = 0;
m.sum = 0;
stop.Start();
js();
stop.Stop();
Console.WriteLine(stop.ElapsedMilliseconds);
Console.WriteLine(m.sum); stop.Reset();
m.i = 0;
m.sum = 0; ;
stop.Start();
t1.Start();
t2.Start();
stop.Stop();
Console.WriteLine(stop.ElapsedMilliseconds);
Console.WriteLine(m.sum);
Console.ReadKey();
} static void js()
{
lock (m)
{
for (; m.i <= 1000000000; m.i++)
{
m.sum += m.i;
}
}
}
}
class Model
{
public int i = 0;
public long sum = 0;
}结果
多线程求和出现错误的结果,我认为i是值类型 无法lock操作,导致可能相同i多次相加。所以用Model类来存储i跟sum,依旧出现错误结果。是lock这个操作没起到作用,还是其他原因。这种累加方式能否用一个方法且多线程能否实现?
{
public static Model m;
static void Main(string[] args)
{
System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();
ThreadStart ts = new ThreadStart(js);
ThreadStart ts2 = new ThreadStart(js);
Thread t1 = new Thread(ts);
Thread t2 = new Thread(ts2);
stop.Reset();
m = new Model();
m.i = 0;
m.sum = 0;
stop.Start();
js();
stop.Stop();
Console.WriteLine(stop.ElapsedMilliseconds);
Console.WriteLine(m.sum); stop.Reset();
m.i = 0;
m.sum = 0; ;
stop.Start();
t1.Start();
t2.Start();
stop.Stop();
Console.WriteLine(stop.ElapsedMilliseconds);
Console.WriteLine(m.sum);
Console.ReadKey();
} static void js()
{
lock (m)
{
for (; m.i <= 1000000000; m.i++)
{
m.sum += m.i;
}
}
}
}
class Model
{
public int i = 0;
public long sum = 0;
}结果
多线程求和出现错误的结果,我认为i是值类型 无法lock操作,导致可能相同i多次相加。所以用Model类来存储i跟sum,依旧出现错误结果。是lock这个操作没起到作用,还是其他原因。这种累加方式能否用一个方法且多线程能否实现?
static void js()
{
lock (LockObj)
{
for (; n < 100000; n++)
{
m += n;
}
}
}
public static object LockObj = new object();
public static int m = 0, n;
static void Main(string[] args)
{
System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();
Console.WriteLine("单线程操作:");
stop.Start();
js();
stop.Stop();
Console.WriteLine("用时:" + stop.ElapsedMilliseconds);
Console.WriteLine("值:" + m); stop.Reset();
m = n = 0;
Console.WriteLine("\n\n\n\n多线程操作:");
stop.Start();
Thread t1 = new Thread(js);
Thread t2 = new Thread(js);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
stop.Stop();
Console.WriteLine("用时:" + stop.ElapsedMilliseconds);
Console.WriteLine("值:" + m);
}
应该像这个样子,你理解理解看。
t1.Start();
t2.Start();
stop.Stop();
Console.WriteLine(stop.ElapsedMilliseconds);
Console.WriteLine(m.sum);
Console.ReadKey();t1,t2还没运行完你就输出了m.sum
.net 4.5的:http://msdn.microsoft.com/zh-cn/library/ms173179(v=vs.110).aspx