dictionary的并发问题

inspiration111 2015-01-06 02:34:19
如题:winform程序
通过一个foreach并发数百个线程 对一个dictionary对象进行add 会死锁吗?没有lock

...全文
341 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
moonwrite 2015-06-02
  • 打赏
  • 举报
回复
list 在一个线程插入 一个线程读取的情况下 会异常 我觉得dictionary 也是会的吧
xian_wwq 2015-06-02
  • 打赏
  • 举报
回复
改用线程安全的容器,问题就不存在了
by_封爱 版主 2015-06-02
  • 打赏
  • 举报
回复
add锁个毛线... 如果你频繁的获取 可能出现"枚举已修改"之类的错误.. 但是并发的ADD应该不会... 所以你的错误应该是别的地方发生的......
於黾 2015-06-02
  • 打赏
  • 举报
回复
引用 13 楼 lineages 的回复:
[quote=引用 2 楼 Z65443344 的回复:] dictionary本身是线程安全的,不会死锁 不过如果需要对字典进行遍历,你需要自己加lock控制,否则可能会发生在遍历的过程中索引超出界限等问题
你置ConcurrentDictionary于何地?[/quote] MSDN上是这样写的. 我也不清楚ConcurrentDictionary和Dictionary到底差在哪里
xuzuning 2015-06-02
  • 打赏
  • 举报
回复

juenice 2015-06-01
  • 打赏
  • 举报
回复
sp1234 这哥们,每次看见就像吃了火药,很叼的样子
暈哥 2015-01-06
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
dictionary本身是线程安全的,不会死锁 不过如果需要对字典进行遍历,你需要自己加lock控制,否则可能会发生在遍历的过程中索引超出界限等问题
你置ConcurrentDictionary于何地?
  • 打赏
  • 举报
回复
異常不時出現在什麽“lock”上。你根本沒沒有寫lock --> 異常不会出現在什麽“lock”上。你根本沒沒有寫lock
  • 打赏
  • 举报
回复
引用 3 楼 inspiration111 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 你自己试试不就知道了。
程序里已经这么做了 debug了好几天 出现了一次未响应 所以才怀疑是不是dictionary死锁了 是不是 子线程的异常 全局是捕捉不到的? 求技术大牛指导[/quote] 首先,異常不時出現在什麽“lock”上。你根本沒沒有寫lock,怎麽會有“死鎖”?人家說三lu奶粉you毒,你來一句“可我沒有找到qing化鉀啊?”,這就不對了。它的問題根本不是lock問題。子線程中的異常,在vs調試環境運行時,肯定可以被調試器捕獲到。調試器一旦捕獲到異常斷點,你就可以從哪一行代碼開始調試了。完全不會因爲它是在子線程中而不能捕獲。除非你寫了try...catch之類的代碼自己欺騙了自己。
lincolnandlinda 2015-01-06
  • 打赏
  • 举报
回复
千万别这么做,Dictionary不是线程安全的。你可以使用ConcurrentDictionary<TKey, TValue> 类,在命名空间System.Collections.Concurrent中。
  • 打赏
  • 举报
回复
基本上,跟一个学生课堂练习一样地去“debug程序”,是发现不了问题的。 要发现并发问题,你要写写一个程序,一旦执行就自动进行10个线程100次并发地dictionaty操作,然后告诉你”已经执行完毕了“。并且你今天做了5次这样的操作没有遇到问题,说不定明天突然第一次做就抛出异常了。 如果只知道手工“debug”,那样的编程肯定不靠谱。
  • 打赏
  • 举报
回复
引用 3 楼 inspiration111 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 你自己试试不就知道了。
程序里已经这么做了 debug了好几天 出现了一次未响应 所以才怀疑是不是dictionary死锁了[/quote] 手工、debug,是不靠谱的。你只有进行成千上万次自动测试,然后发现了bug,才应该debug。 你应该能够重现bug了,然后在一两条语句上设置断点,或者根本不设置断点而等着调试器自动在捕获异常时中断。而不是胡乱给许多代码设置断点去搞什么debug。 哪有平白无故瞎debug的?你的那种“debug了好几天了”简直是莫名其妙的,你不知道如何重现bug,干么去debug?
於黾 2015-01-06
  • 打赏
  • 举报
回复
程序未响应说明主线程死循环了
  • 打赏
  • 举报
回复
那就是有什么地方发生死锁了吧
inspiration111 2015-01-06
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
全局是主线程的,异步是另外一个线程的,异步异常你应该通过另一种方式来捕获
// Handle unhandled exceptions
            Application.ThreadException +=
                new ThreadExceptionEventHandler(Application_ThreadException);

            AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
在program 里的main方法里加了这个 还是捕捉不到任何异常 但是程序未响应。
  • 打赏
  • 举报
回复
全局是主线程的,异步是另外一个线程的,异步异常你应该通过另一种方式来捕获
// Handle unhandled exceptions
            Application.ThreadException +=
                new ThreadExceptionEventHandler(Application_ThreadException);

            AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
inspiration111 2015-01-06
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
你自己试试不就知道了。
程序里已经这么做了 debug了好几天 出现了一次未响应 所以才怀疑是不是dictionary死锁了 是不是 子线程的异常 全局是捕捉不到的? 求技术大牛指导
於黾 2015-01-06
  • 打赏
  • 举报
回复
dictionary本身是线程安全的,不会死锁 不过如果需要对字典进行遍历,你需要自己加lock控制,否则可能会发生在遍历的过程中索引超出界限等问题
exception92 2015-01-06
  • 打赏
  • 举报
回复
你自己试试不就知道了。

110,565

社区成员

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

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

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