进程和线程的比较

进程和线程的比较 ##(侧重线程)

     概念:线程是轻量级的进程,进程所有信息对该进程的所有线程都是共享的,包括可执行的程序文本,程序的全局内存和堆内存、栈以及文件描述符;
     一切进程至少都有一个执行线程。
  • 线程创建
  • 进程创建fork函数
pid_t fork(void);
//**返回值** :子进程中返回0,父进程返回子进程程ID,出错返回-1。

fork常用于:一个父进程希望复制自己,使父子进程同时执行不同代码段。或一个进程要执行不同的程序。
- vfork函数

vfor用于创建一个子进程,而子进程和父进程共享地址空间,fork的子进程具有独立地址空间
vfork保证子进程先运行,在它调用exec()或exit()之后父进程才可能被调度运行。

  • 线程创建函数
int pthread_create(pthread_t *thread,//返回线程ID
const pthread_attr_t *attr,//设置线程的属性,attr为NULL表示默认属性
void *(*start_routine)(void *),//start_routine是函数地址,
                               //线程启动后要执行的函数
void *arg);//传给线程启动函数的参数
  • 线程等待
    进程等待函数wait/waitpid
pid_t wait(int *status);
//返回值: 成功返回被等待进程pid,失败返回-1;
//参数:输出型参数,获取进程退出状态,不关心则可以设置成为NULL;
pid_t waitpid(pid_t pid, int* status,int options);
//返回值: 当正常返回时,返回收集到的子进程的进程ID,如果设置WNOHANG,
//而调用中waitpid发现没有已退出的子进程可以搜集,则返回0;
//如果调用中出错,则返回-1;
//参数: pid:-1 等待任一子进程,和wait等效;pid>0 等待其进程ID与pid相等的子进程。
//    status: WIFEXITED(status):若无为正常退出进程返回的状态,则为真。
          //WEXITSTATUS(status):若WIFEXITED非零,提取子进程退出码
   //option: WNOHANG:若pid指定的子进程没有结束,则waitpid()返回0,不必等待。若正常结束,则返回该子进程的ID。
  • 线程等待函数
    这里写图片描述

线程为何需要分离??? 同理于僵尸进程,僵尸进程的事儿,要看另一篇详解,之后奉上链接。
int pthread_detach(pthread_t thread);
**

线程的分离状态决定一个线程以什么样的方式来终止自己。

**
线程的默认属性,一般是非分离状态,
这种情况下,原有的线程等待创建的线程结束。
只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
而分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。
程序员应该根据自己的需要,选择适当的分离状态。

  • 进程ID和线程ID
struct task_struct{
pid_t pid;
pid_t tgid;
...
};

多线程进程,又被称作线程组,pid 为线程组的ID,tgidc才是对应线程ID;
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值