线程同步小问题

王思明 2015-01-04 01:48:48
1.Monitor.Pulse 方法:通知等待队列中的线程锁定对象状态的更改。 这个方法什么时候有用?
2.经常在代码中看到
  lock (m_ObjLock)
{
m_IntCounts = m_DicSessions.Count;
}

给变量赋值的过程不是特别快吗? 这个锁定有意义吗?
又不是在一个方法里面调用这个变量反复使用到,就使用一次还锁起来
3.TryEnter方法什么时候会失败?
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
王思明 2015-03-13
  • 打赏
  • 举报
回复
4) 示例: 在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤: a) 将实例变量中的值加载到寄存器中。 b) 增加或减少该值。 c) 在实例变量中存储该值。 如果不使用 Increment 和 Decrement,线程可能会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤。当第一个线程重新开始执行时,它改写实例变量中的值,造成第二个线程执行增减操作的结果丢失。(线程都维护着自己的寄存器)
王思明 2015-03-13
  • 打赏
  • 举报
回复
引用 楼主 maanshan1 的回复:
1.Monitor.Pulse 方法:通知等待队列中的线程锁定对象状态的更改。 这个方法什么时候有用? 2.经常在代码中看到
  lock (m_ObjLock)
                    {
                        m_IntCounts = m_DicSessions.Count;
                    }
给变量赋值的过程不是特别快吗? 这个锁定有意义吗? 又不是在一个方法里面调用这个变量反复使用到,就使用一次还锁起来 3.TryEnter方法什么时候会失败?
原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事物中断。 如何识别原子操作?32位处理器(x86系列)或32位软件理论上一次能处理32位,也就是4个字节的数据;而64位处理器(x64系列)或64位软件理论上一次就能处理64位,即8个字节的数据。在处理器|软件能一次处理的位数范围内的单个操作即为原子操作。(这段文字也告诉我们:(1)64位操作系统或64位软件理论上运行更快;(2)32位操作系统上为什么不能运行64位软件,而反过来却可以。) 在多线程编程环境中指:一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。.NET为我们提供了多种线程同步的方法,我们可以根据待同步粒度大小来选择合适的同步方式。
江南小鱼 2015-01-04
  • 打赏
  • 举报
回复
线程同步,防止读出脏数据。 语句执行再快,也是一条指令一条指令的执行。
  • 打赏
  • 举报
回复
我的原则,“退一步”,我们先不谈技术理论,用测试数据说话。
  • 打赏
  • 举报
回复
引用 楼主 maanshan1 的回复:
2.经常在代码中看到
  lock (m_ObjLock)
                    {
                        m_IntCounts = m_DicSessions.Count;
                    }
给变量赋值的过程不是特别快吗? 这个锁定有意义吗? 又不是在一个方法里面调用这个变量反复使用到,就使用一次还锁起来
运行再快,也不是“原子”的操作,这个语句执行过程中完全可能经历着集合改变。 这个 lock 不太必要,不是因为“这条语句执行的快”。就像你在 #2 楼上说的,这条语句如不 lock,给 m_IntCounts 赋值不同,不会造成程序抛出异常,因此没有必要写 lock。 如果你说“它执行挺快的,所以没有必要使用 lock”,那么一些自认为是“技术霸”的人就不干了。如果你说“不加 lock ,你也一样测试不出程序bug来!所以没有必要加 lock。”,那么他就没话说了,他必须亲自动手给你找出一个测试才行。
bdmh 2015-01-04
  • 打赏
  • 举报
回复
成不成功,和这个数不能随便改动,是完全两个概念,如果这个数字错了,可能引起悲剧
这是和你具体业务联系在一起的,不要单单看这一句话
王思明 2015-01-04
  • 打赏
  • 举报
回复
即使赋值的时候m_DicSessions.Count又有了变动,赋值不也是成功的,变动就让它变动啊,只是觉得这个锁定没有意义
bdmh 2015-01-04
  • 打赏
  • 举报
回复
i=1,就这句话,又不是原子操作,汇编是3句话,只有原子操作才是线程安全的,再不加锁的情况下

110,533

社区成员

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

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

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