当前位置:编程学习 > C#/ASP.NET >>

【在线等】引用类型在多线程下的问题

线程有生产者消费者两个·
共享区里的数据的一个属性是引用类型的 
这消费者提取共享取数据的时候 应用类型的值已经变成下一个值了
                                            
就是  
List<Class1> CL=new List<Class1>();
处理Cl;
a.ChildLIst=Cl;
然后将a传入共享取,共享区有lock的
消费者线程用a.ChildList的时候就直接是第下一个个数据了;
有人懂吗?
我在线等! 多线程 引用值类型 共享 --------------------编程问答-------------------- 没人在吗?呜呜呜 求解答啊 --------------------编程问答-------------------- 问题说不清楚,

--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 1、只有用锁,锁才管用。
2、锁只管加锁的那一会。

如果你读写都加锁了,但是操作顺序是“写、写、读”的话,你读到的仍然是第二次写的数据,这是因为你只用了一个存储区。 --------------------编程问答--------------------
引用 楼主 zhou122568640 的回复:
然后将a传入共享取,共享区有lock的
消费者线程用a.ChildList的时候就直接是第下一个个数据了;


怎么了,这有什么可奇怪的?难道你两个过程分别访问a.ChildList的时候,第二个方法不是读取“下一个个数据”吗?

这有什么问题吗? --------------------编程问答--------------------
引用 5 楼 soaringbird 的回复:
1、只有用锁,锁才管用。
2、锁只管加锁的那一会。

如果你读写都加锁了,但是操作顺序是“写、写、读”的话,你读到的仍然是第二次写的数据,这是因为你只用了一个存储区。


就是 缓存区有是个个数为3的数组。a.ChildLIst=CL之后,把a给缓存区,然后CL又为下一个数据做准备,这个时候刚放进去的数值会变。有写lock'的呀 --------------------编程问答-------------------- "就是 缓存区有是个个数为3的数组。a.ChildLIst=CL之后,把a给缓存区,然后CL又为下一个数据做准备,这个时候刚放进去的数值会变。有写lock'的呀 "
把详细的代码给出来,不然真的不清楚你在说什么。 --------------------编程问答--------------------
引用 7 楼 zhou122568640 的回复:
Quote: 引用 5 楼 soaringbird 的回复:

1、只有用锁,锁才管用。
2、锁只管加锁的那一会。

如果你读写都加锁了,但是操作顺序是“写、写、读”的话,你读到的仍然是第二次写的数据,这是因为你只用了一个存储区。


就是 缓存区有是个个数为3的数组。a.ChildLIst=CL之后,把a给缓存区,然后CL又为下一个数据做准备,这个时候刚放进去的数值会变。有写lock'的呀

每次数据新建一个CL --------------------编程问答-------------------- list<Class1> CL=new list<Class1>();
Class1[10] C1=new C1[10];
While()
{
...准备生成新的a
if(...)
{
Cl.add(C1[i]);
}
if(...)
{
a.ChildList=CL;
shared.setbuffer(a);
}
...准备生成新的a
}
代码太长了,大概是这个意思,以前不是多线程的,在setBuffer这里直接计算就好了,现在这里传入之后,有变化。而且list CL和数组C1是起对照作用,不能每次都建立一个啊,我是希望传入共享区之后就不变啊。
共享区就是setBuffer和getBuffer的时候有写lock的(缓存区满的时候和空的时候) --------------------编程问答-------------------- 要说清楚,你LOCK住的是什么?变化的是什么?
现在你代码又给不全,只能靠猜,
如果你LOCK的是a,而ChildList,CL有变化,那不是很正常啊 --------------------编程问答-------------------- 参考:http://bbs.csdn.net/topics/390144084

到底是加锁(只让一个线程执行其它的都阻塞)还是对控制变量(包括List和Array)预先复制,需要综合平衡考虑。或者你可以换着试一试,然后看看哪一个方法让程序整体更快、用户操作体验更平滑。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,