线程与进程的区别
来源:互联网 发布:qq2013 mac os x 10.6 编辑:程序博客网 时间:2024/05/07 07:39
线程与进程有 根本的不同。
每个进程 有其独立的 数据空间,文件描述符,以及进程的ID。
线程共享 一个数据空间,文件描述符,以及进程的ID。
进程间 可以 通过 管道,socket, 信号,退出/等待 以及 运行环境来进行会话。
线程是多个 函数的并发进行,运行在一个独立的进程中,即具有相同的运行环境。 共享全局变量,因此 线程之间的通信 通过更改与读取 全局变量来完成。
然而线程间通信既有用又极危险。表现为记下几点:
(1)共享数据结构
使用malloc, free 管理内存时。 一个线程分配了一块空间存储字符串。当此线程做其他事时,另一个线程使用free将其释放了,并可能用作其他用途了。灾难发生。
(2)共享文件描述符
fork()调用后,产生子进程,文件描述符自动被复制。在子进程中关闭一个从父进程那里继承来的文件描述符之后,此描述符对对父进程仍是打开的,互不影响。
而在多线程中,当同一个文件描述符被两个不同的线程共用时,一个线程函数关闭该文件,则此文件描述符对此进程中的任何线程都是关闭的。然而此时其他线程后续仍需要对此文件描述符的操作。
(3)fork, exec, exit, signals (注意)
所有线程共享一个进程。如果一个线程调用了exec,系统内核用一个新的程序(正确的说应该是 进程--一个运行的程序)取代当前的程序,从而所有正在运行的线程都会消失。
如果一个线程执行了exit(),那么整个进程都将结束运行。同时,若任线程运行导致内存段异常使线程崩溃,都将导致整个进程的崩溃。
多进程中父进程与子进程互不会影响。
信号量的使用将更复杂,随后附上。
互通消息:
对于进程来说,当子进程终止时,父进程调用 wait() ,等待子进程结束,消除僵尸进程。
函数原型:
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status);
进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
而对于线程来说,没有子线程与父线程只说,需通过 进出。
多线程中,主线程可以通过 pthread_join(pid, &status); 阻塞,等待 线程pid 结束,并用status 保存返回值。
同时可以通过 条件变量完成通信。随后附上。
- 线程与进程的区别
- 线程与进程的区别
- 线程与进程的区别
- 进程与线程的区别
- 进程与线程的区别
- 线程与进程的区别
- 进程与线程的区别
- 进程与线程的区别
- 进程与线程的区别
- 线程与进程的区别
- 线程与进程的区别
- 进程与线程的区别
- 进程与线程的区别
- 进程与线程的区别
- 进程与线程的区别
- 进程与线程的区别
- 线程与进程的区别
- 进程与线程的区别
- ant学习(4)
- EL表达式格式化日期
- 表空间容量查询,包括临时表空间(网上收集)
- C#、ASP.NET获取当前应用程序的绝对路径,获取程序工作路径
- hdu 1079 Calendar Game 博弈
- 线程与进程的区别
- System.DllNotFoundException: 无法加载DLL
- 新手硬盘安装CentOS 6.3
- c++类的几点注意事项
- 说说 java中的接口
- doubango的android版本编译
- Arch Linux 新版安装
- struts html标签
- 2014: 青年歌手大奖赛_评委会打分