A very detailed tutorial about .Net multithreading

By Liang Zhang - Last updated: Wednesday, March 10, 2010

Worth reading:  Multi-threading in .NET

Filed in Dot Net

A TimedLock

By Liang Zhang - Last updated: Tuesday, March 9, 2010

The original article is from here

Because the nice-looking .Net lock keyword is translated with try{Monitor.Enter(obj);}finally{Monitor.Exit(obj)}, there is no timeout for Monitor.Enter, that may make it easier to cause some deadlock issues. That’s why Ian Griffiths invented his new lock. He and some other guys discussed a lot about how to improve the lock both in efficiency and usability. I am not going to talk much.

the code is like below:

using System;
using System.Threading;
 
// Thanks to Eric Gunnerson for recommending this be a struct rather
// than a class - avoids a heap allocation.
// Thanks to Change Gillespie and Jocelyn Coulmance for pointing out
// the bugs that then crept in when I changed it to use struct...
// Thanks to John Sands for providing the necessary incentive to make
// me invent a way of using a struct in both release and debug builds
// without losing the debug leak tracking.
 
public struct TimedLock : IDisposable
{
    public static TimedLock Lock (object o)
    {
        return Lock (o, TimeSpan.FromSeconds (10));
    }
 
    public static TimedLock Lock (object o, TimeSpan timeout)
    {
        TimedLock tl = new TimedLock (o);
        if (!Monitor.TryEnter (o, timeout))
        {
#if DEBUG
            System.GC.SuppressFinalize(tl.leakDetector);
#endif
            throw new LockTimeoutException ();
        }
 
        return tl;
    }
 
    private TimedLock (object o)
    {
        target = o;
#if DEBUG
        leakDetector = new Sentinel();
#endif
    }
    private object target;
 
    public void Dispose ()
    {
        Monitor.Exit (target);
 
        // It's a bad error if someone forgets to call Dispose,
        // so in Debug builds, we put a finalizer in to detect
        // the error. If Dispose is called, we suppress the
        // finalizer.
#if DEBUG
        GC.SuppressFinalize(leakDetector);
#endif
    }
 
#if DEBUG
    // (In Debug mode, we make it a class so that we can add a finalizer
    // in order to detect when the object is not freed.)
    private class Sentinel
    {
        ~Sentinel()
        {
            // If this finalizer runs, someone somewhere failed to
            // call Dispose, which means we've failed to leave
            // a monitor!
            System.Diagnostics.Debug.Fail("Undisposed lock");
        }
    }
    private Sentinel leakDetector;
#endif
 
}
public class LockTimeoutException : ApplicationException
{
    public LockTimeoutException () : base("Timeout waiting for lock")
    {
    }
}
Filed in Dot Net

题樱花

By Liang Zhang - Last updated: Saturday, March 6, 2010

早上出门,小区当中一株樱花在凄风苦雨当中楚楚可怜,乃题之:

君非傲寒物,
奈何生此时。
昨夜思蝴蝶,
明朝闹春枝。
寂寂游人绝,
茕茕鸟鸣稀。
零落成泥日,
可怨东风迟?
Filed in General

梅花

By Liang Zhang - Last updated: Wednesday, February 24, 2010

Filed in General

吾师之死

By Liang Zhang - Last updated: Tuesday, January 19, 2010

我的老师摩罗先生,虽然我不曾听过他的一堂课,但是在我的思想轨迹之上,他曾给我带来醍醐灌顶的教导。2002年的一个冬日,我无意中逛进了一个旧书店,随便四处翻翻的时候,看到了一本棕色封面的书:正是先生的《耻辱者手记》, 简单的浏览一下,顿时被其文章震撼,回来之后迫不及待的挑灯夜读,每一页都让我新奇,兴奋,感慨。他对极权政体的深邃洞察力,对普罗大众深切的悲悯,让我 20多年收到的灌输教育受到了巨大的冲击,第一次,我真正的开始怀疑,怀疑他们告诉我的那些历史是否真是如此。此后的很多个夜晚,都让我无眠,凭着这弥足 珍贵的怀疑精神,我开始一点点的重构我的价值和思想,宏大的题材(革命,祖国,统一,强大等等)再也不能轻易的欺骗我,我开始对人文主义产生浓厚的兴趣, 开始真正用心去阅读西方文学和历史,这样一步步建立了自由主义的信仰,我开始信仰良知,爱,自由。

每一个人的卑怯都是我的卑怯,每一个人的苦难都是我的苦难,每一个人的不幸都是我无可摆脱的耻辱,每一个人的恐惧和堕落都会在我心上刻下永不愈合的伤口。

每一个生命个体的苦难,都是全人类共同的耻辱,每一个生命个体的罪恶,都是全人类共同的耻辱,每一个生命个体的尊严的丧失,都是全人类共同的耻辱。

我渴望着在咀嚼耻辱的过程中,变得坚强一点,有勇气一点,与自己心中真的人的形象接近一点。

我知道自己成不了真的人,但是我依然要反叛自己。

我宁愿做一只被围猎的豺狼,而决不做一只癞皮狗。

我宁愿做一个魔鬼,而决不做一个安分守己的非人。

我相信别的非人们的耻辱,也不见得比我少。我愿所有的非人都跟我一起来咀嚼咀嚼,放下非人的自尊心,来咀嚼我们共同的耻辱。

而这一切都是受教于摩罗先生。
但,这几年我又开始看到先生的文字,不是像耻辱者手记那样来源于地摊,而是网络,在豆瓣网上看到先生出了一本新书:《中国站起来》,看了简介之后,我完全无法想象,这本书的作者竟然也是摩罗,什么时候他开始为民族主义摇旗呐喊了?看看摘录的内容吧:
谁在妖魔化中国人?是西方人,还是我们自己?
中国人一百年前的精神大崩溃是怎样发生的?
谁是中国精神大崩溃的幕后旗手,谁是背后的最大赢家?
胡适为什么要替祖宗忏悔?蔡元培为什么要培养西方文化的信徒?
五四新文化运动积极启蒙救亡,是在帮助中国人走出屈辱的困境,还是为中国人戴上自轻、自贱、自虐的精神枷锁,为中国社会更大的危机埋下了隐患?
我们需要知道这些答案,但我们更需要知道:
中国的西化时代何时终结?中国人崇洋媚外何时休?
当代爱国青年为什么被贴上愤青的标签?
谁是当代中国的思想启蒙家与国胆?谁是崛起的一代
怎样做一个高贵、自信、精神崛起的中国人?
本书反思五四运动以来中国社会泛滥的文化软骨病,说破中国百年西化史的真相;揭露西方殖民史的真相,首次撕破西方人自我美化的画皮,打破国人西方崇拜病的迷信。
本书抨击身在中国、心系西方的洋奴精神,高举拒绝西化、重返巅峰旗帜,呐喊中国人没有特殊的劣根性、不是劣等民族、更不是西方奴隶;呼吁中国人重树民族自信,找回民族尊严,重塑大国豪情,挺起脊梁做崛起的一代

这样的文字几乎已经与当年的《中国可以说不》,最近的《中国不高兴》并驾齐驱了。
在如今一个自由缺乏的时代,普通公民不知道什么时候就会受到公权力的侵犯,暴力拆迁,城管、警察、官员凌辱百姓,而普通的百姓被代表,被自杀,被躲猫猫, 被。。。。这这样的时代正是需要有脊梁的知识分子启蒙大众,对权力说不,先生却急转向左,选择了安全地批判西方,而不是做政府的牛虻,实在让人唏嘘。
看到这本书的出版,我知道,我与摩罗先生已经分道扬镳:Plato is dear to me, but dearer still is truth.
我心中的摩罗先生已经死了.

Filed in General

我闭上眼睛就看到中国的明天–影评《十月围城》

By Liang Zhang - Last updated: Wednesday, January 6, 2010

比起满屏的辫子戏,红色戏,辛亥革命为题材在国内影视作品还是比较少见的,也许是因为这样的题材过于敏感,涉及到的是民国这个亚洲第一个民主共和国诞生的历史背景,如果往深度去走,很可能被著名的广电总局给干掉。《十月围城》从这个角度来看,是一个异类,在看了篇首革命党领袖慷慨激昂的向大众说民主,说自由,宣扬林肯的名言“民有,民治,民享”。很是稀奇,毕竟就算在民主和自由写入本朝“宪法”当中,却从来不曾实践过的。

《十月围城》一个很大的亮点在于其角度,不再是大人物扭转乾坤,不再是著名的革命英雄,而是把关注点放在了来自不同阶层,不同背景,不同信仰的小人物上,他们很多对于民主对于革命可以说是一无所知,却最终卷入了这个宏大的历史事件,他们为保卫”孙大炮“而死,尽管到死他们大多不知孙文是谁。 阿四纯粹是报效自己的主人,为老爷和少爷而不惜命;和尚王复明(从名字上似乎可以看出,他来自民间的抗清组织:会党,各种以反清复明为旗帜的地下帮会:洪门,天地会等等);乞丐”刘公子“是士为知己者死,也为了个自己的孽情求个解脱;而小混混沈重阳是想在给自己的女儿留下一个英雄的形象;或许只有商人李玉堂,热血青年重光是理解民主革命的意义的。

重光在赴死前跟阿四说,你每天一闭眼,看见的都是阿莼,我闭上眼睛就看到中国的明天,这是理想主义者能够前仆后继为推翻专制而努力的源动力,重光是一个典型:单纯,激进,热情。革命当中牺牲了无数这样的美好青年,不过在几千年专制的土壤当中开出自由之花的过程也许需要无数这样的青年热血,重光不知道,他闭眼看到的只是一个幻象。他看不到就算民国建立了,还有人要做皇帝,还有无数的军阀野心家在向往高高在上的绝对权力,即便他所不惜以死来保护的孙先生。后面也会学习苏俄方法,要求党员向他个人效忠。理想主义者如果活下来了,看到的一定是无数的丑恶,无数的争权夺利。当初那美好的誓言,政客是少有人能够真正兑现的。 重光更不会想到,他死后的一百年,竟然有那么多深重的惨烈的黑暗要在这个古老大地上演,他哪里会想到有几十年的内战,哪里想到内战结束以后是极权主义的铁幕降临,毛贼上台更是造成无数的浩劫,古老民族的新生竟是如此之艰难。到今天,自由,民主,人权,平等,博爱,这样的普世价值依然被抵制在国门之外。一百年的历史,转了一个圈而已。1898年,慈禧发动戊戌政变,让维新改良的路被堵死;1908年清廷宣布立宪,却用“皇族内阁”的方式欺骗了所有对满清抱有最后一线希望的人们。革命,就成了唯一的选项。3年后在武昌,大清朝轰然崩塌。可惜这条崩溃路线,正是当朝也在走的,20年前铁血镇压了体制内的改革,立宪遥遥无期,或许再往下,就是孙先生们该出场的时候了。

李玉堂问刘公子:“为了一个女人,值吗?”,刘公子反问“为了明天的事,值吗?”,俩人相视而笑,回望百年,无数的重光们,阿四们,他们如果知道这一切,又将如何回答这个问题呢?

Filed in General • Tags: