LInux pthread_join理解
2016-06-13 15:53
441 查看
在Linux中,默认情况下是在一个线程被创建后,必须使用此函数对创建的线程进行资源回收,但是可以设置Threads attributes来设置当一个线程结束时,直接回收此线程所占用的系统资源,详细资料查看Threads attributes。
其实在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。不过这个copy过程和fork不一样。 copy后的进程和原先的进程共享了所有的变量,运行环境。这样,原先进程中的变量变动在copy后的进程中便能体现出来
那么pthread_join函数有什么用呢???
pthread_join使一个线程等待另一个线程结束。
代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行
所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。
在多线程编程的时候我们往往都是以for循环的形式调用pthread_join函数,既然运行prhtead_join之后主线程就阻塞了,也没法调用后面的pthread_join,那么以for循环有什么用呢?
主线程是在第一个线程处挂起。
比如有:
pthread_join(1,NULL);
pthread_join(2,NULL);
pthread_join(3,NULL);
pthread_join(4,NULL);
pthread_join(5,NULL);
实际上主线程在pthread_join(1,NULL);这里就挂起了,在等待1号线程结束后再等待2号线程。
当然会出现3,4,5比1,2先结束的情况。主线程还是在等待1,2结束后,发现3,4,5其实早已经结束了,就会回收3,4,5的资源,然后主线程再退出。
推荐阅读:
Linux 多线程同步(信号量) http://www.linuxidc.com/Linux/2012-09/70825.htm
Linux多线程──主线程和子线程分别循环一定次数 http://www.linuxidc.com/Linux/2012-07/65201.htm
Linux多线程──3个子线程轮流运行 http://www.linuxidc.com/Linux/2012-07/65200.htm
Linux多线程──生产者消费者 http://www.linuxidc.com/Linux/2012-07/65199.htm
Linux多线程──读者写者问题 http://www.linuxidc.com/Linux/2012-07/65198.htm
Linux基础编程 多线程中的互斥锁 pthread_mutex_lock http://www.linuxidc.com/Linux/2012-07/65030.htm
Linux基础编程 多线程同步 pthread_cond_signal http://www.linuxidc.com/Linux/2012-07/65031.htm
参考文献:
http://www.linuxidc.com/Linux/2013-09/89931.htm
Enjoy it !
其实在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。不过这个copy过程和fork不一样。 copy后的进程和原先的进程共享了所有的变量,运行环境。这样,原先进程中的变量变动在copy后的进程中便能体现出来
那么pthread_join函数有什么用呢???
pthread_join使一个线程等待另一个线程结束。
代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行
所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。
在多线程编程的时候我们往往都是以for循环的形式调用pthread_join函数,既然运行prhtead_join之后主线程就阻塞了,也没法调用后面的pthread_join,那么以for循环有什么用呢?
主线程是在第一个线程处挂起。
比如有:
pthread_join(1,NULL);
pthread_join(2,NULL);
pthread_join(3,NULL);
pthread_join(4,NULL);
pthread_join(5,NULL);
实际上主线程在pthread_join(1,NULL);这里就挂起了,在等待1号线程结束后再等待2号线程。
当然会出现3,4,5比1,2先结束的情况。主线程还是在等待1,2结束后,发现3,4,5其实早已经结束了,就会回收3,4,5的资源,然后主线程再退出。
推荐阅读:
Linux 多线程同步(信号量) http://www.linuxidc.com/Linux/2012-09/70825.htm
Linux多线程──主线程和子线程分别循环一定次数 http://www.linuxidc.com/Linux/2012-07/65201.htm
Linux多线程──3个子线程轮流运行 http://www.linuxidc.com/Linux/2012-07/65200.htm
Linux多线程──生产者消费者 http://www.linuxidc.com/Linux/2012-07/65199.htm
Linux多线程──读者写者问题 http://www.linuxidc.com/Linux/2012-07/65198.htm
Linux基础编程 多线程中的互斥锁 pthread_mutex_lock http://www.linuxidc.com/Linux/2012-07/65030.htm
Linux基础编程 多线程同步 pthread_cond_signal http://www.linuxidc.com/Linux/2012-07/65031.htm
参考文献:
http://www.linuxidc.com/Linux/2013-09/89931.htm
Enjoy it !
相关文章推荐
- [Linux]I/O多路复用和epoll
- linux查看系统信息
- linux下打包出现brut.common.BrutException: could not exec command: [/tmp/brut_util_Jar_22418586694498,解决方案
- linux后台进程守护和java进程查询
- 用vnc实现windows远程连接linux桌面
- Linux命令总结
- xshell如何正确来连接远程Linux服务器?
- linux内存寻址——内存管理
- Linux select()函数
- Linux学习笔记(3)
- 使用秘钥对登录Linux系统
- linux工具---用qemu调试linux内核
- Linux基础
- Linux源代码目录
- linux内存管理
- Linux初学 - head,tail,grep,sed,yum,find
- laravel5.0在linux环境下解决.htaccess无效和去除index.php
- Linux学习笔记(2)
- Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
- Linux-SVN 常用命令详解