从高中一次半夜不冲厕所的经历谈程序

来源:互联网 发布:数据库建立索引 编辑:程序博客网 时间:2024/04/27 22:50

我高中的时候,是住校生。寝室到了10点半就会熄灯,早上6点40左右就要起来跑早操。

 

一天半夜大概两三点,起床放了个大号。想要充厕所的时候发现没有水,很尴尬,也没有其他的办法。半夜还冷的很。就上床睡觉了,想着明早一早起来的时候冲就是了。

 

等到第二天早上,一早起来,急急忙忙的出早操,生怕迟到,迟到是会被班主任老左骂的,我也就忘了冲厕所。等中午回到寝室的时候,宿管大叔找到我说我没有冲大便的事,说我生活习惯有问题之类的。我和他解释了半天,大叔最后说,算了,我本来还打算还跟你们老左说的,看你认错态度比较好,就算了。我心中os,瓜娃子娃娃,这个事情都还要给老左说,你大爷,我又不是故意的。后面,宿管大叔警告我说,以后注意点,下不为例。

 

宿管大叔的这种行为,用我们四川话说,就是男牙尖。

 

高中差不多都是10年前的事了,后面随着社会的飞速发展,我在很多地方都发现了红外线感应的厕所。只要你把你的屁股挪出了红外线的感应范围,那他就会自动帮你冲掉便便了。多好的事儿啊。

 

我一直都坚持一个观点,程序来源于生活,而且程序也高于生活。程序和生活是很关联的。

 

当我们学习到多线程编程的时候,就难免会学习到锁的使用。我们也会发现到,因为我们记性不好(也许不是),我们都可能会忘了“冲厕所”,我们可能会忘掉把锁释放掉。

 

想想这么一个函数:

 

int fun(int x) {

 lock(...);

 if (...) return 1;

 else if (...) return 2;

 else throw ...;

 unlock(...);

}

 

这个时候,我们忘掉“冲厕所”的机会就太大了,多个return语句,以及可能出现的异常抛出。都有可能导致我们忘记了释放掉锁。以为我们要在每个return,throw前面加上一个unlock。

 

那么我们能不能给这个函数加一个红外线装置?让我们屁股一挪开的时候,他就充掉我们的便便?

 

在我们学习程序的时候,被误以为C语言程序之父的谭浩强先生曾经写到过的《C语言》中讲,变量三要素:类型,名称,值。其实我觉得还有一个东西很重要,作用域。为什么重要呢?当你在坑里的时候,你是在大便,大便在坑里是正常的,当你走出坑的时候,在星巴克喝咖啡的时候(我还没喝过呢),在电影院看电影的时候,如果有个大便是在你视线之类,这不就囧死你娘亲了。如果没有作用域,我们的程序世界不知道会带来怎样的一种不可想象的混乱。

 

因为作用域很重要,我们可以使用作用域的概念完成“红外线装置”。

定义如下一个类ScopeLock

class ScopeLock {

public:

 ScopeLock(pthread_mutex_t mutex) : mutex(_mutex)

 {

  pthread_mutex_lock(&mutex);

 }

 ~ScopeLock() {

 pthread_mutex_unlock(&mutex);

 }

private:

 pthread_mutex_t mutex;

};

 

好了,这样你就只需要在你需要锁上锁的地方顶一个一个ScopeLock的局部变量,然后就不用管了,就好比,你只需要打开厕所的们,安心大便,就不用想着冲厕所的事儿了。多好的事儿啊。

 

需要说明这个ScopeLock不是我自己发明的,来自POSA卷2,《pattern oriented software architecture》,不错的一本书。

 

如果,我只能把忘了冲大便这个事情学习这么一点儿,我觉得我就肤浅了。说过,程序高于生活,你还能想到其他的吗?想到同样方法解决类似问题的用途吗?

 


原创粉丝点击