线程与进程的区别

来源:互联网 发布: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 保存返回值。
同时可以通过 条件变量完成通信。随后附上。
原创粉丝点击