如果线程池里有N个线程,都会触发同一个事件(或调用同一个方法),如何确保事件只被其中一个线程触发(调用),等其触发完毕,事件被处理后,再轮到其他线程去触发该事件呢?方法也是同样的处理方式...
解决方案 »
- 能不能用C#编写出类似与虚拟光驱的winform程序
- .net的ide左侧工具栏的效果该用什么控件
- 征求vs.net2003开发的B/S架构应用项目实例
- datagridview如何设置列
- 有什么办法能够把RTF控件旋转90度放置?
- 搜索文件标题和文件内容
- 写在TEXTBOX里的代码如何放到程序代码中
- asp.net里面是不是所有的控件都必须放在<form runat="server"></form>里面呀?
- DataTable如何添加记录
- 如何可以侦测当前的盘符是否是光驱或者是软驱?
- [!!!help!!!] 线程同步,互斥锁lock的问题...lock为何不起作用???愚翁,速马等老大请进... [!!!help!!!]
- netmicro(麦)请进,因CSDN限制,之前那个帖已经无法回复。
Sample code as follows:
//Use lock keyword
private void FunUnique( )
{
lock(this)
{
//Do what you want here
}
}//Use mutex classs
private Mutex mUnique = null;
private void FunUnique()
{
if( mUnique == null ) mUnique = new Mutex();
mUnique.WaitOne();
//Do what you want here
mUnique.ReleaseMutex();
}
“lock(expression),lock 语句的表达式必须表示一个引用类型的值。”ArrayList myList;private void test()
{
lock(myList)
{
ClientList.Add(XXX);
}
Console.WriteLine("hello world");
}上面的语句是不是表示只锁住了myList这个对象?如果A线程和B线程都调用到test(),但A先获得了myList的互斥锁对myList进行修改,那么B就无法修改myList,但是否可以执行后面的Console.WriteLine()呢?如果上面的程序该成private void test()
{
lock(myList)
{
ClientList.Add(XXX);
Console.WriteLine("hello world");
}
}执行结果又会怎么样?你给出的示例中的lock(this)又表示什么意思?我还是对lock或者Mointer.Entry()所传的参数感到很迷惑
Monitor.Enter(obj);
try{
...
} finally {
Monitor.Exit(obj); // 这一行在上面的代码出错的时候也会执行
}Monitor.Enter(obj)的作用是获取在obj上的排他锁
但是如果锁已经被其它线程获取了,这个调用就会暂时死掉(术语叫“阻塞”),直到其它线程放开,本线程终于能获取排他锁的时候才会返回所以你的问题:“B就无法修改myList,但是否可以执行后面的Console.WriteLine()呢?”因为B过程在lock处阻塞了,所以后面的Console.WriteLine也暂时无法执行。要注意的是,虽然某个对象,例如myList被锁住了,但是如果过程C不尝试锁它而直接操作,例如myList.Clear(),就仍然可以成功,这时候A和B就可能会出错了,因为A和B试图独占使用权的myList被其它线程修改了
private void DoSomething() {
...
}那么要使这个方法每次只能由一个线程调用的方法就是private readonly object DoSomethingLock = new object();
private void DoSomething() {
lock (DoSomethingLock) {
...
}
}为什么不lock其它东西,例如this?因为要尽可能减低lock互相冲突的可能性,找个不影响其它lock的东西来lock,例如特别为这个方法准备的一个空对象DoSomethingLock