线程问题,大家帮忙!~

hmily821023 2008-06-16 03:39:53
using System;
using System.Threading;
class UsingLock
{
static Thread[] thread = new Thread[3];
int addSum ;
static void Main()
{
UsingLock myUsingLock = new UsingLock();
for(int i=0;i<3;i++)
{
Thread myThread = new Thread(new ThreadStart(myUsingLock.DoSum));
thread[i] = myThead;
thread[i].Name = "线程" + i;
}
for(int i=0;i<3;i++)
{
thread[i].Start();
}
Console.ReadLine();
}
void Dosum()
{
for(int i=0;i<10;i++)
{
//lock(this)
//{
addSum += 2;
Thread.Sleep(1);
Console.WriteLine(Thread.CurrentThread.Name+"执行第 " + i +" 次,addSum=" + addSum);
//}
}
}
}
/////////////////////////////// 部分执行结果////////////////
线程0,执行第2次,addSum =18
线程1,执行第2次,addSum =20
线程2,执行第2次,addSum =22
线程0,执行第3次,addSum =24
线程1,执行第3次,addSum =26
线程2,执行第3次,addSum =28
线程0,执行第4次,addSum =30
线程1,执行第4次,addSum =32
线程2,执行第4次,addSum =34
线程0,执行第5次,addSum =36
线程1,执行第5次,addSum =38
线程2,执行第5次,addSum =40
线程1,执行第6次,addSum =42
线程2,执行第6次,addSum =44
线程0,执行第6次,addSum =46

线程1,执行第7次,addSum =48
线程2,执行第7次,addSum =48
线程0,执行第7次,addSum =48
线程1,执行第8次,addSum =54
线程2,执行第8次,addSum =56


问题:
为什么执行第7次时,线程1线程2线程0结果都是48呢?请问这是怎么回事?
在执行第8次时线程1 结果怎么成为54的??







...全文
41 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyedge 2008-06-16
  • 打赏
  • 举报
回复
反成汇编看一下吧 ~。~
三个线程在取值的时候都取到了 addSum =46 然后在自己的栈中运行,
也或者,在Write的时候都取到了 addSum =48
Thread.Sleep(1);
Console.WriteLine(Thread.CurrentThread.Name+"执行第 " + i +" 次,addSum=" + addSum);
交换一下顺序,可能重复的机虑就小了。

全是猜的,推荐lock一下,解决问题才是根本
hmily821023 2008-06-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lovefootball 的回复:]
lock(addSum)
[/Quote]

我知道 lock 后是正确的
我要问的是 注释后 这样的结果是怎么产生的?
lovefootball 2008-06-16
  • 打赏
  • 举报
回复
lock(addSum)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧