生产者消费者中的问题,急! 我怀疑是你的while循环的问题,因为那是一个无限循环,要看你什么时候挂起线程,循环速度会很快,如果你挂起线程的时候,此线程还没有退出临界区,那么任何别的线程当然就进不了临界区.还有退出线程的问题,因为是个无限循环,因为你很可能采用一种强制措施强迫线程退出,这可能导致一些资源没有被回收,包括对临界区的资源.我也是初学,只能发表一下自己的看法,有什么错误,请多多指教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你在中断某一线程前线作一件事:Monitor.enter(b);。(中断线程)Monitor.exit(b); 经过一个晚上的调试,现在的问题是一个线程停止(Abort)后,另一个线程仍然能运行;一个线程正在临界区中或正在等待进入临界区时被挂起(Suspend),则另一个线程永远不能进入临界区。 我现在是改用lock(b)了,一个线程停止(Abort)后,另一个线程仍然能运行;一个线程正在临界区中或正在等待进入临界区时被挂起(Suspend),则另一个线程还是不能进入临界区。 线程应该处在wait状态时挂起他 例:class theadcommon(){ public static string b= "123";}class thead_1 { public void op(){ while (true){ lock (theadcommon.b){ theadcommon.b = "34"; } } }}class thead_2 { public void op(){ while (true){ lock (theadcommon.b){ theadcommon.b = "34"; } } }}如果此时thead_1 执行到lock (theadcommon.b){ 后被强制中止,那么就不会出现unlock,于是theadcommon.b 将永久被锁死!其它任何等待操作它的线程将被永久挂起于队列中,这就是为什么thread.abort 要抛出异常的原因,目的就是让你知道线程异常中止,要你自己注意是否有要善后的处理。不少的贴子我都有警告过,必须要设置一个公用变量数组(推荐使用sortlist 之类的二维表),在各线程的while 内部去判断是否线程应该中止,比如上面改成:class theadcommon(){ public static string b= "123"; public static bool thead_1_mustend = true; public static bool thead_2_mustend = true;}class thead_1 { public void op(){ while (theadcommon.thead_1_mustend){ lock (theadcommon.b){ theadcommon.b = "34"; } } }}class thead_2 { public void op(){ while (theadcommon.thead_2_mustend){ lock (theadcommon.b){ theadcommon.b = "34"; } }}然后如果想中止某线程只要将该线程对应的值改成 false 就可以自然的结束,这是最安全的方法 再说个关于线程安全的例子class a:lock (a){ //code lock(b){ //code }}class b:lock (b){ //code lock(a){ //code }}假若,上面二个线程任意一个出现中止或挂起,将导致二个线程都死锁,永久进入睡眠状态。因为他们都在等待对方解锁。这是一个比较容易犯的错误,所以thread.abort 同样也是臭名远扬!我个人在回答任何一个关于线程的问题上都是提倡使用变量判断中止 “变量判断中止”是指在使用abort前线设置相应的变量作记号吗?还是把thead_2_mustend 设置成false后不用使用abort线程“就可以自然的结束”? 还是把thead_2_mustend 设置成false后不用使用abort线程“就可以自然的结束”?对,这是推荐的方法 不容易理解我改一下:class thead_2 { public void op(){ while (true){ if (! theadcommon.thead_2_mustend) break; lock (theadcommon.b){ theadcommon.b = "34"; } } }}此举的目的只是为了避免使用abort,除非在保证没有lock并且无法自然结束的线程中才考虑使用abort 哦,我明白ArLi2003的意思了。 你是说在进入某个线程后先判断某个变量,然后决定该线程是正常做工作,还是什么也不做,等到程序结束时自生自灭。这样有些线程虽然没有被abort,但是什么也不做,像行尸走肉一样。只是这样的活着不做事的线程占用的系统资源是不是有点浪费?还是这些资源是安全应付的代价呢:) 应该不会像行尸走肉的,如果变量被设为false了,这个方法也就结束了,线程也就结束了这是我对上面例子的理解 你是不是在未出缓冲区(未完成整个lock 体)就中止了该线程?那当然就死锁了,只有等待线程销毁了,你试试在析构里清理上面是我的怀疑,你可以在要进入缓冲区的地方使用:Monitor.TryEnter(对象) 查一下是不是被锁死了 各位高手,小菜鸟请你们帮帮忙 初级问题:为什么我所做的练习最后的错误都是服务器标记的格式不正确? C#制作ActiveX问题 重新抛出异常和不用try有什么区别? 我在一本教材上找的一段聊天程序源码,调试时出现问题 C#写的windows服务是不是不稳定呀. 关于用C#创建系统帐户的问题 ASP。NET 怎么控制权限啊 asp.net服务器控件的事件是怎样触发的???? 对不起各位了,WebService版人太少,所以到这里来问个问题:ArrayList如何在WebService中作为返回值传递 怎样把整数1格式成为L0000001 如何取得XML中的值
Monitor.enter(b);
。(中断线程)
Monitor.exit(b);
public static string b= "123";
}
class thead_1 {
public void op(){
while (true){
lock (theadcommon.b){
theadcommon.b = "34";
}
}
}
}class thead_2 {
public void op(){
while (true){
lock (theadcommon.b){
theadcommon.b = "34";
}
}
}
}如果此时thead_1 执行到lock (theadcommon.b){ 后被强制中止,那么就不会出现unlock,于是theadcommon.b 将永久被锁死!其它任何等待操作它的线程将被永久挂起于队列中,这就是为什么thread.abort 要抛出异常的原因,目的就是让你知道线程异常中止,要你自己注意是否有要善后的处理。不少的贴子我都有警告过,必须要设置一个公用变量数组(推荐使用sortlist 之类的二维表),在各线程的while 内部去判断是否线程应该中止,比如上面改成:class theadcommon(){
public static string b= "123";
public static bool thead_1_mustend = true;
public static bool thead_2_mustend = true;
}
class thead_1 {
public void op(){
while (theadcommon.thead_1_mustend){
lock (theadcommon.b){
theadcommon.b = "34";
}
}
}
}class thead_2 {
public void op(){
while (theadcommon.thead_2_mustend){
lock (theadcommon.b){
theadcommon.b = "34";
}
}
}然后如果想中止某线程只要将该线程对应的值改成 false 就可以自然的结束,这是最安全的方法
//code
lock(b){
//code
}
}class b:lock (b){
//code
lock(a){
//code
}
}假若,上面二个线程任意一个出现中止或挂起,将导致二个线程都死锁,永久进入睡眠状态。因为他们都在等待对方解锁。这是一个比较容易犯的错误,所以thread.abort 同样也是臭名远扬!我个人在回答任何一个关于线程的问题上都是提倡使用变量判断中止
public void op(){
while (true){
if (! theadcommon.thead_2_mustend) break;
lock (theadcommon.b){
theadcommon.b = "34";
}
}
}
}此举的目的只是为了避免使用abort,除非在保证没有lock并且无法自然结束的线程中才考虑使用abort
只是这样的活着不做事的线程占用的系统资源是不是有点浪费?还是这些资源是安全应付的代价呢:)
这是我对上面例子的理解