博客和笔记的区别:笔记大概可以写的随意一些,自己能看懂就好,而写博客就不一样了,写博客时会自觉的尝试把一个概念介绍清楚,
这大概很锻炼人的语言组织能力,所以我想,技术人员确实应该多写点博客。
起因:
以前也进行过多线程编程,不过是在原来的代码的基础上,添加一点锁啊什么的,对多线程整个系统的知识了解的不多,
这一次项目真好能用到多线程的知识,正好借这个机会学习一下多线程的知识。
线程是有生命周期的,而主线程是特殊的,主线程不但有线程的语义,还有进程的语义。
所以当一个主线程退出时,它不会管其他线程是不是还在运行,所有的线程都被终结了,以前写过这样的代码。
/************************************************************************* > File Name: lifecycle.c > Author: likeyi > Mail: likeyiyy@sina.com > Created Time: Thu 17 Apr 2014 09:53:25 AM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <pthread.h> void * delay_print(void * arg) { sleep(1); printf("Hello world\n"); } int main(int argc,char * argv[]) { pthread_t tid; int result = pthread_create(&tid,NULL,delay_print,NULL); if(result != 0) { printf("create thread error\n"); exit(0); } printf("printf form main\n"); return 0; }
结果子线程一直不执行,我还以为一个线程创建后会自己剥离呢,现在我知道不会了。
要想一个线程自己剥离,要么在pthread_create中设置线程属性为可剥离的,要么在进入线程后调用pthread_detach(pthread_self())来分离自己。
/************************************************************************* > File Name: lifecycle.c > Author: likeyi > Mail: likeyiyy@sina.com > Created Time: Thu 17 Apr 2014 09:53:25 AM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <pthread.h> void * delay_print(void * arg) { pthread_detach(pthread_self()); sleep(1); printf("Hello world\n"); } int main(int argc,char * argv[]) { pthread_t tid; int result = pthread_create(&tid,NULL,delay_print,NULL); if(result != 0) { printf("create thread error\n"); exit(0); } printf("printf form main\n"); return 0; }
以上当然只是我想当然的想法,实际上运行时仍然是主线程运行完了就退出了,初始线程退出了,那么整个进程就结束了,不管线程有没有剥离自己。
好吧,这个错误,让我知道我对“分离”的概念可能理解错了。
我心中的分离就是让两个线程不再相关,你结束了,但是我不会因为你的结束而结束。
这是个很好的想法,但是这个想法是错的。
pthread_detach实际上只是和资源回收相关,当一个线程没有分离自己而且结束了,那么它的资源就在那里不会释放,除非有其他线程join它。
但是通常初始线程并不想join它的子线程,所以我们才会用到pthread_detach技术。
上面的那段代码,子线程虽然剥离了自己,但是它仍然没有机会执行。
那么我们应该怎么办呢?
1.使用join,使用join将使初始线程阻塞,直到子线程结束。
2.初始线程使用pthread_exit而不是使用return。
如果你希望初始线程结束后,子线程继续执行,那么你应该使用pthread_exit而不是return。pthread_detach和这个并没有关系。
pthread_join是有用的,但并不是规则。