【求助】C# 多线程同步交叉同步一个对象中的不同资源 本帖最后由 weiyu523 于 2013-09-02 10:37:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是线程死锁,那还是你没控制好,比如lock需要lock一个全局的object,如果是数据库死锁,就是你的业务逻辑有问题或自己写的访问表的顺序有问题,造成表的死锁 已经加了一个lobject 的对象做为锁。但这样加,好像是一锁就把类里边的所有的Queue和DataTable都锁起来了,而其实,某些时候并不需要把所有的资源都锁起来,只是锁定某个特定的资源。这也是我头疼的问题。 你在线程运行的方法外部加一个lock就可以的啊,这样只运行一个线程去执行这个方法的 谢谢,不过或许这不是我想要的结果,原因:1、其实线程1与线程2中几乎没有共享的代码块,线程1与线程2中加载的方法也几乎是完全不同的2、线程1与线程2在更新共享的表之前,有很多预备工作,这些是不相互干扰的。只有在对表进行处理时才会需要锁住共享的表,而且此时只是需要锁定共享的表。但是如果用lock,是不是这个时候的两个队列也被锁定了?或者说,当我想锁定某一个Queue的时候,是不是此时另外一个Queue和共享的这个表也不能操作了? OK本人已找到答案,希望对以后遇到相似问题的朋友有个帮助。lock(){}lock括号中的内容只是个标识,与要锁定的类成员无关。一般使用一个空object作为标识。如:object locker = new object();此处,当我要在某线程单独处理positionT时,只需要在线程方法中涉及positionT操作的地方加上lock(locker)当不同的线程遇到locker标识时,便会先判断locker是否被别的线程锁定,如果有,则等待。在没有lock(locker)的地方,线程正常运行。如果我要对几个资源分别上锁,其实可以定义多个空object锁分别对相关的操作进行互斥。 关于层float:right 如何获得当前时间? C#制作点唱系统! DataGridView中的鼠标右击显示修改删除的问题 后台复杂运算,加个进度条,进度条假死怎么解决 求一个数据库设计思路 请看过Wayfarer's Prattle写的.net平台AOP技术研究的人进来看看,急事求教,在线等。 怎么给datagird加上滚动条啊?在线等 随机数 C#做的winform程序,怎样让他出错之后能自己结束所有线程? c#读取带样式(包括图片和table以及文本样式)的word文档 WPF,绑定到集合是双向还是单向的?
已经加了一个lobject 的对象做为锁。
但这样加,好像是一锁就把类里边的所有的Queue和DataTable都锁起来了,而其实,某些时候并不需要把所有的资源都锁起来,只是锁定某个特定的资源。这也是我头疼的问题。
1、其实线程1与线程2中几乎没有共享的代码块,线程1与线程2中加载的方法也几乎是完全不同的
2、线程1与线程2在更新共享的表之前,有很多预备工作,这些是不相互干扰的。只有在对表进行处理时才会需要锁住共享的表,而且此时只是需要锁定共享的表。但是如果用lock,是不是这个时候的两个队列也被锁定了?
或者说,当我想锁定某一个Queue的时候,是不是此时另外一个Queue和共享的这个表也不能操作了?
lock括号中的内容只是个标识,与要锁定的类成员无关。
一般使用一个空object作为标识。
如:object locker = new object();此处,当我要在某线程单独处理positionT时,只需要在线程方法中涉及positionT操作的地方加上lock(locker)
当不同的线程遇到locker标识时,便会先判断locker是否被别的线程锁定,如果有,则等待。
在没有lock(locker)的地方,线程正常运行。
如果我要对几个资源分别上锁,其实可以定义多个空object锁分别对相关的操作进行互斥。