lock 把我锁住了,大家帮忙看看 在线等

wanglovec 2009-03-11 02:35:00


private void button1_Click(object sender, EventArgs e)
{
InstanceCaller = new Thread(new ThreadStart(this.InstanceMethod));

InstanceCaller.Start(); // 线程启动

InstanceCaller1 = new Thread(new ThreadStart(this.InstanceMethod1));

InstanceCaller1.Start(); // 线程启动


}

private void InstanceMethod() // 线程的执行函数
{
while (t)
{
lock (thisLock)
{
for (int i=0;i<100;i++)
{
data[i] = i;
}
}
}
}


private void InstanceMethod1() // 线程的执行函数
{
while (t)
{
lock (thisLock)
{
for (int i = 99; i >=0; i--)
{
data[i] = i;
}
}
}
}


private void button2_Click(object sender, EventArgs e)
{
t = false; //停止
InstanceCaller.Abort(); // 关闭
InstanceCaller1.Abort();// 关闭 在执行它时出问题,死锁了
}



Thread InstanceCaller;
Thread InstanceCaller1;
bool t = true;

int []data =new int[100] ;

private Object thisLock = new Object();

...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglovec 2009-03-12
  • 打赏
  • 举报
回复
呵呵 确实是,要不CPU 100%

另,可能是退出时 有问题,导致死锁。是不是应该先等一段时间?
gxj760998 2009-03-12
  • 打赏
  • 举报
回复
哎,兄弟。你的THREAD不能休息下啊????
退出LOCK后,好歹也SLEEP下,不然你CPU 怎么跑的过来。
sanrex 2009-03-12
  • 打赏
  • 举报
回复
更安全的方式是在for循环内检查t。这样就和时间片更加无关了。
sanrex 2009-03-12
  • 打赏
  • 举报
回复
1. 仔细看看cppfaq 提到的文章,应该会解决你的困惑。你的程序是否发生死锁主要看abort引发的异常被插入到线程内代码的那个位置。这和cpu执行时间片有关。
http://tdanecker.blogspot.com/2007/08/do-never-ever-use-threadabort.html

2. 我以前也是像 xianguang321 那样干。简单。尽量让thread自己判断何时退出,这样才安全。而abort就比较粗暴了。
xianguang321 2009-03-12
  • 打赏
  • 举报
回复
应该不会吧?是不是本程序中其他因素的影响,比如资源共享?
wanglovec 2009-03-12
  • 打赏
  • 举报
回复
很奇怪,昨天 测试的时候经常 死锁 退出的时候退不出来,今天又不出现问题了。

昨天 是 还在运行别的 东西 ,比较耗资源 ,是不是有这个原因?
xianguang321 2009-03-12
  • 打赏
  • 举报
回复
时间片轮询,要不只被一个线程占用CPU,另一个线程就没法运行,不知道这样能不能解决?
wanglovec 2009-03-12
  • 打赏
  • 举报
回复
让它停止一秒 是什么意思呢 ?
xianguang321 2009-03-12
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
InstanceCaller = new Thread(new ThreadStart(this.InstanceMethod));

InstanceCaller.Start(); // 线程启动

InstanceCaller1 = new Thread(new ThreadStart(this.InstanceMethod1));

InstanceCaller1.Start(); // 线程启动


}

private void InstanceMethod() // 线程的执行函数
{
while (t)
{
lock (thisLock)
{
for (int i=0;i <100;i++)
{
data[i] = i;
}
}
Thread.Sleep(1);
}
}


private void InstanceMethod1() // 线程的执行函数
{
while (t)
{
lock (thisLock)
{
for (int i = 99; i >=0; i--)
{
data[i] = i;
}
}
Thread.Sleep(1);
}
}


private void button2_Click(object sender, EventArgs e)
{
t = false; //停止
InstanceCaller.Abort(); // 关闭
InstanceCaller1.Abort();// 关闭 在执行它时出问题,死锁了
}



Thread InstanceCaller;
Thread InstanceCaller1;
bool t = true;

int []data =new int[100] ;

private Object thisLock = new Object();
wanglovec 2009-03-12
  • 打赏
  • 举报
回复
1 。你被锁住是很正常的,因为你的代码里面没有任何defend code
>> 没有防护代码是什么意思呢?
2。我这种方法有问题,那该如何同步呢?
tsp860901 2009-03-12
  • 打赏
  • 举报
回复
顶你个肺
cppfaq 2009-03-11
  • 打赏
  • 举报
回复
1 。你被锁住是很正常的,因为你的代码里面没有任何defend code
2 。Never use thread.abort。 See here:
http://tdanecker.blogspot.com/2007/08/do-never-ever-use-threadabort.html
littleantant 2009-03-11
  • 打赏
  • 举报
回复
MARK
wanglovec 2009-03-11
  • 打赏
  • 举报
回复
大家都没用过吗?

111,126

社区成员

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

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

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