线程与进程的区别

线程与进程有 根本的不同。
每个进程 有其独立的 数据空间,文件描述符,以及进程的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 保存返回值。
同时可以通过 条件变量完成通信。随后附上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值