Zade's Weblog

程序人生

Monthly Archives: 1月 2011

线程同步和日志

当主线程退出的时候,一般的逻辑是要所有的子线程join,这样以来不至于使得所有的子线程被强行的中断。
我现在的程序的逻辑是一旦主线程退出,我需要某种渠道告诉子线程,如果你处理完了所有的任务,那么你也退出吧。在所有的线程

退出以后,我还要通过日志记载资源释放的情况。
大体的代码架构如下:
main_thread()
{
run_when_recieve_term_signal;
send_term_tasks_to_all_sub_threads;
all_sub_threads_join;
}
sub_thread()
{
run_handle_tasks_when_receive_term_task;
exit_thread;
}
main_function()
{
//some other process
main_thread();
log_when_resources_are_released;
}
我现在遇到的问题是,一旦主程序退出,资源释放的日志并没有写入。问题在什么地方?
我简单的分析了一下,因为主线程向子线程发送结束任务的以后,然后再让所有的子线程join,但是这个时候可能子线程已经收到结

束任务的命令,并且已经退出,在这个卡当,会不会产生微妙的问题?因为资源释放的日志都是在主线程发出的。
所以我的策略是让子线程join以前,主线程休眠一段时间:
main_thread()
{
run_when_recieve_term_signal;
send_term_tasks_to_all_sub_threads;
sleep;
all_sub_threads_join;
}
我的理解不知道对不对,因为我也找不到相关的知识,但是结果如我所愿了。

小妞妞的牙牙学语

我记得好像是在小妞妞很小的时候,大约1,2个月的时候,她就能发出比较模糊的声音,非常类似于“不”。对此我很欣慰,我的性格比较软弱,不善于拒绝别人。小妞妞的第一个声音竟然是表示拒绝,相当于克服了我的这个最大的缺点。遗传变异,优胜劣汰,进化的趋势让我高兴。

“哦”,是她最早学会的声音之一。无论她想表达什么意思,这几乎是她唯一的声音。指着电灯,指着空调,指着电视机,她都用这个声音表达她的思想。为人父母者向理解婴儿的意思,不能光凭声音,还要看表情和动作。

在她10个月的时候,有一次她在镜子前面饶有兴趣的看自己的样子,她姥姥不经意的问道,“美不美?”,“美!”,小妞妞非常清晰的发出了这个声音。这是她发音最清楚的一个字;而且,貌似她还理解了这个字的意思。这对于她而言真是一个重大的突破。

“妈妈”这两个字也是在她大约10个月的时候,就能比较清楚的发出这个声音了。“爸爸”要稍后一些,我虽然更希望她能够更早的学会叫爸爸,但是老婆在她身上付出的心血确实比我多。小妞妞很好的体现了“多劳多得”的良好精神。

大约在她1岁的时候,“哦”这个简单的发音有了变化,她用拖长或者变音的方式表达自己的惊讶或者惊喜的心情。看到一个新的玩具,看到图书上小鸭子倒背翅膀走路的姿态,她都会发出这个声音。她已经学会简单的使用感叹词表达自己的感情了。

在给小妞妞的众多的育儿书中,其中的一本上有一个蓝色的大象,上面写着“blue”的英文单词,她妈妈就对着她说“blue”,小妞妞也跟着学。这个发音她学的不是而别像,只是有些样子,但是这却是她的第一个英文单词发音。

小妞妞现在14个月了,以后她当然还会更多的发音,让我拭目以待吧!

小妞妞终于会走了

早在小早在小妞妞11个月的时候,她就有会走的摸样了。但是期间她病了一场,有些耽搁,所以我们一直也没有继续着方面的锻炼。

 

过了一岁生日的时候,可以确定的是小妞妞会走了。但是好像她的胆子太小,还必须我们牵着她的手。其实与其说我们牵着她的手,还不如说她牵着我们的手。在温泉宾馆前面的草坪上,我故意不牵她的手,而是抓着她的衣领。她虽然开始的时候反抗,但是后来也不得不同意了。她到处跑着玩,我偷偷的放手了,她不知道,照样是导出跑着玩。不过一旦她发现我的阴谋,立刻停下,等我去牵她的手。所以说她已经会走了,只是胆小而已。

 

前几天元旦放假,老婆到成都去玩,小妞妞中午的时候跟我一起玩。我躺在床上,她沿着床边玩,很长的一段时候她是双手离开床边的。我一旦站起来,她又找我的手牵。

 

大前天我下班回家,看到小妞妞再到处的跑,已经完全不需要手牵了。

 

这真是一个值得纪念的时刻!

signal和多线程

今天在linux下面使用signal,用在多线程的环境下,环境是red hat.

signal函数可以使得程序接管OS的一些特殊的信号。我在主线程下面执行了这个函数,但是所有的子线程也受到了这个信号的影响。我的本意是是只是主线程拦截这些信号,而子线程使用默认的处理方式。看来是不行了。

signal本来就是单线程模式下的函数,signal的标准对于多线程没有任何的评说,只能是各个实现着自己定义了,red hat是这样的定义,可能其他的OS会有其他的行为。