问一下有关锁的问题
ahadf
2007-10-10
D中似乎没有内嵌monitor之类的语法,在D中要么就只能写scope Lock lock=new Lock(mutex);要么就只能scope(exit)mutex.unlock();但习惯了c++中Lock lock(mutex);的写法,觉得这样很累赘.
各位一般是怎么写的呢? |
|
oldrev
2007-10-10
用内置 synchronized 语句就成
|
|
Colorful
2007-10-10
synchoronized只能用来线程间同步,而且有时候这玩意性能并不高。
例如互斥,信号量,事件等同步方式,还是要采用楼主的方式。 此外,Lock-Free Data Structures也有助于多线程程序的性能提高。 |
|
ahadf
2007-10-10
想了一下,可以仿照ruby来搞:
void scope_lock(T)(ref T t,void delegate() fn) { t.lock(); scope(exit) t.unlock(); fn(); } scope_lock(mutex, { do_something(); } ); 有scope就是好,比ruby,java之类用异常好多了。 |
|
oldrev
2007-10-10
老实说,没有用 scope(exit) 的清晰,而且多了一个调用
|
|
oldrev
2007-10-10
Colorful 写道 synchoronized只能用来线程间同步,而且有时候这玩意性能并不高。
例如互斥,信号量,事件等同步方式,还是要采用楼主的方式。 此外,Lock-Free Data Structures也有助于多线程程序的性能提高。 synchoronized 本身就是用的 mutex,Windows 版则是 Critical Section。 至于事件量之类的 Windows 特有东东一般都予以忽略。 |
|
Colorful
2007-10-10
我宁愿多打几行代码也不采用上面的代码方式。
匿名委托的方法代码量少还好说,如果一个100~200行的方法,甚至超过200行,到达几千行(这不是说笑,我看过我们公司代码有的方法确实几千行)的方法,那还不得要命啊。 这样写出来的代码将很难阅读,而且也不易维护。 |
|
ahadf
2007-10-10
oldrev 写道 老实说,没有用 scope(exit) 的清晰,而且多了一个调用
见仁见智吧,我个人很喜欢这种风格的。 |
|
ahadf
2007-10-10
Colorful 写道 我宁愿多打几行代码也不采用上面的代码方式。
匿名委托的方法代码量少还好说,如果一个100~200行的方法,甚至超过200行,到达几千行(这不是说笑,我看过我们公司代码有的方法确实几千行)的方法,那还不得要命啊。 这样写出来的代码将很难阅读,而且也不易维护。 嗯嗯,我想问题不是代码长短,而是需要加锁的区域有多少。如果只有一个,那把所有代码写进括号跟在前头加上m.lock();scope(exit) m.unlock()也没多大区别;如果加锁的区域多了或者将来可变,那采用集中的scope(exit)确实方便些。 |
|
Colorful
2007-10-10
oldrev 写道 Colorful 写道 synchoronized只能用来线程间同步,而且有时候这玩意性能并不高。
例如互斥,信号量,事件等同步方式,还是要采用楼主的方式。 此外,Lock-Free Data Structures也有助于多线程程序的性能提高。 synchoronized 本身就是用的 mutex,Windows 版则是 Critical Section。 至于事件量之类的 Windows 特有东东一般都予以忽略。 要顾虑Win上的多线程开发,这些玩意是不能避免的。因为Critical Section在线程大于一个阙值后,性能会严重下降,因为线程竞争会导致有些线程饥饿。这时候就必须采用其他的同步方式了,比如自旋锁之类。 此外,Linux也应该有相对应的机制吧。 我听说Linux平台上有条件变量的锁机制,但是WinXP上却没有,Vista里有。 完了,我这辈子算是陷在Windows的泥潭里了。 |