posts - 1, comments - 45, trackbacks - 5, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

最新评论

@老刘很氓
-------------------------------------------
请教个问题,关于文章中ping pong的例子
两个线程在for循环前都有lock ( ball ),锁定了ball
在一个线程for循环中执行Monitor.Pulse( ball )能使lock锁释放吗?
也就是为什么能输出ping pong...交替的结果?

re: 在DataAdapter中开启事务 cyz 2008-06-20 14:23  
买菜路过
@Chris.W
我不是很明白你的问题,为什么要用while(true)呢?
最近我在学习C#下的多线程编程
以前做java比较多
使用C#(或者说.NET)还是第一次
看了这篇文章 很有启发
看了之后我想问一个问题
希望能给予解惑 不胜感激啊

public double Result(int seed)
{
//...
// Wait for all of the terms to be calculated.
WaitHandle.WaitAll(autoEvents); //[1]
// Reset the wait handle for the next calculation.
manualEvent.Reset(); //[2]
return firstTerm + secondTerm + thirdTerm;
}
当主线程(第一次)执行到[1]处的代码时
如果autoEvents中有任意一个状态是nonsignaled时
(autoEvents被初始为false[nonsignaled])
主线程将被挂起
直到autoEvents所有的事件变为true[signaled]后
才会被唤醒并继续执行下去
下面假设有两种情况
1-CalculateBase先被调度执行,其他三个线程后被调度执行
1-1 CalculateBase被调度执行
1-2 计算baesNumber的值
1-3 设置manualEvent为true[signaled]
这个时候CalculateBase还会继续执行下去了吧?
也就是说CalculateBase将manualEvent设置为true[signaled]后
还会继续执行下去
执行到了manualEvent.Set()之后并跳出到CalculateBase函数
这样CalculateBase线程也就执行结束了
如果不是使用ThreadPool启动这四个线程
而是让这四个线程一直 while(true) 执行下去的话???
不知道会有什么问题???
1-5 Calculate[First/Second/Third]Term被调度执行
这里又假设CalculateFirstTerm先被调度执行
1-6 CalculateFirstTerm取得随机浮点数
1-7 CalculateFirstTerm等待manualEvent被设置为true[signaled]
由于之前manualEvent已经被CalculateBase线程设置为true[signaled]
所以CalculateFirstTerm线程没有被挂起
会继续往下执行
计算firstTerm的值并把autoEvents对应的值设置为true[signaled]
这个时候CalculateFirstTerm线程执行结束
1-8 CalculateSecondTerm和CalculateThirdTerm的情况如上
1-9 当三个CalculateXXXTerm线程执行完毕之后
主线程被唤醒并马上将manualEvent设置为false[nonsignaled]
计算出三个XXXTerm的和并返回
2-其他三个县城先被调度执行之,之后才轮到CalculateBase被调度执行
假设四个线程被调度执行的顺序如下
CalculateFirstTerm线程
CalculateSecondTerm线程
CalculateThiredTerm线程
CalculateBase线程
2-1 CalculateFirstTerm线程被调度执行
2-2 CalculateFirstTerm取得随机浮点数
2-3 CalculateFirstTerm线程等待manualEvent被设置为true[signaled]
由于此时manualEvent还是nonsignaled状态
所以CalculateFirstTerm线程被挂起
2-4 CalculateSecondTerm线程和CalculateThiredTerm线程的执行情况如上
2-5 CalculateBase线程被调度执行
2-6 计算baesNumber的值
2-7 设置manualEvent为true[signaled]
由于这是一个ManualResetEvent
所以三个CalculateXXXTerm线程都被唤起
于是这三个CalculateXXXTerm线程被放到准备执行队列
等待系统的调度
2-8 CalculateBase线程执行完毕
2-9 三个CalculateXXXTerm线程被调度执行
2-10 三个CalculateXXXTerm线程执行结束
2-11 由于三个CalculateXXXTerm线程和CalculateBase线程都执行结束
所以[1]得等待结束
于是控制返回到主线程
随后主线程计算结果并继续下一次计算

***问题***

CalculateFirstTerm线程
CalculateSecondTerm线程
CalculateThiredTerm线程
CalculateBase线程
主线程会同时启动上四个线程
这四个线程会一直执行下去(内部都有 while(true) 无限循环)
那么当主线程从[1]返回后尚未执行到[2]处的代码
CalculateXXXTerm线程就已经开始被调度执行的话……


最近我在学习C#下的多线程编程
以前做java比较多
使用C#(或者说.NET)还是第一次
看了这篇文章 很有启发
不错,又温习了一下~
技术实在又通俗易懂,要比那些大谈特谈设计模式的好
支持!!!
顶,写的很不错
@ICQ
MSDN关于这块举的例子在我翻阅相关资料前没有看懂,所以我觉得有必要对MSDN里面的东西做些解释。
呵呵 刘老师,受教了啊,多谢啊
Monitor在线程数小于3个或者在多核下性能不好.建议在dotnet程序中就不要用这种锁了
好文章,受益非浅
re: c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex 只有了解了基础知识才会写出好东西 2007-12-13 10:56  
不错.这些是很有实际意义的。希望刘老师多写些类似的东西.
某些人认为很浅显,就不用理他们了。这些人说不定自己都没搞懂。
"只是一个技术的应用而已难道也要分割深浅吗"说的好
好东西啊 比那些讲设计模式和设计框架的实在多了
@九头龙
请你看完文章再FP好不好,什么是浅显的东西,什么是复杂的东西?只是一个技术的应用而已难道也要分割深浅吗?难道BLOG上全部都大谈设计模式和框架设计才叫深吗?另外,你给的链接我看了,和我这篇文章讲的完全不是一个东西。
关于C#多线程,这么显浅的东西还是不要放在首页。建议看一下这篇文章:《C#中的多线程》:http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html

有时候[methodimpl(methodimploptions.synchronized)]也是不错选择
lock是.NET中最好用的也是最优化的,但在某些情况下只有Mutex与Semaphore才适用。
Jeffrey关于线程syncblock的介绍,看了之后就什么都明白了 :)
好多字哦。。。刘老师,我要转.net不跟蒋老师混了
好东西
曾经接触过一些。
其实有些常用的线程命令很多在net1.1的东西如今在2.0、3.0中已经不建议使用了
的确有必要仔细研究下了。
感谢博主
re: 在DataAdapter中开启事务 niumx 2007-11-29 15:15  
捧个人场
re: 在DataAdapter中开启事务 rosen 2007-11-25 23:09  
@ylg:老刘不会删你的留言吧,呵呵。他是我同事,RP不会那么差,我相信他。
re: 在DataAdapter中开启事务 ylg 2007-11-24 19:34  
留言被删除了?晕
re: 在DataAdapter中开启事务 老刘很氓 2007-11-24 14:01  
是的,MSDN也有说明它不符合CLS规范,它破坏了可见性规则,上面3个方法都是各有有缺点的。
re: 在DataAdapter中开启事务 曲滨*銘龘鶽 2007-11-24 13:53  
方法三:利用System.Reflection命名空间下的PropertyInfo类的GetProperty方法取得table adapter的私有connection属性,附加上transaction对象后,再通过PropertyInfo的SetValue方法将改造后的connection属性设置回table adapter实例:

强制外挂这种不好、破坏系统本身的规矩、容易误导众生
re: 在DataAdapter中开启事务 老刘很氓 2007-11-24 12:51  
@ylg:已经修正
re: 在DataAdapter中开启事务 老刘很氓 2007-11-23 17:19  
设置回去还是有必要的,应为不是直接操作当前实例的属性。
re: 在DataAdapter中开启事务 Enzo 2007-11-23 16:41  
@老刘很氓
呵呵--引用--------------------------------------------------
老刘很氓: 搞java的同志,不要乱来
--------------------------------------------------------
re: 在DataAdapter中开启事务 Tony Qu 2007-11-23 16:30  
代码贴~~~不提倡
re: 在DataAdapter中开启事务 Ariel Y. 2007-11-23 15:50  
喜欢XxxxHelper
re: 在DataAdapter中开启事务 ss202 2007-11-23 15:49  
看不懂
re: 在DataAdapter中开启事务 RicCC 2007-11-23 15:40  
使用DbTransaction transaction = connection.BeginTransaction(isolationLevel);之后,应该没有必要再将transaction设置给dataadapter了
re: 在DataAdapter中开启事务 zhong 2007-11-23 15:37  
UP
re: 在DataAdapter中开启事务 马甲 2007-11-23 15:36  
灌水,楼下保持队形...(▔﹁▔)
re: 在DataAdapter中开启事务 老刘很氓 2007-11-23 15:35  
搞java的同志,不要乱来
re: 在DataAdapter中开启事务 土豆土豆 我是地瓜 2007-11-23 15:34  
老刘忙!
re: 在DataAdapter中开启事务 rosen 2007-11-23 15:34  
板凳,同样看不懂。
re: 在DataAdapter中开启事务 lzz 2007-11-23 15:33  
看不懂,老刘忙不忙?