Linux多线程基础(基础)

进程与线程

进程: 一个正在执行的程序,它是资源分配的最小单位
线程:是程序执行的最小单位,可以理解为进程的一个实体。一个进程可以有多个线程。线程不能离开进程单独存在,离开进程谈线程是没有意义的。

多线程的相比多进程的优势

  1. 创建子进程是拷贝父进程所有的资源进行并发处理,这样需要更多的资源消耗,对硬件要求更高。而多进程是子进程共享父进程的资源,并不是完全的拷贝复制父进程的资源。
  2. 子进程往父进程返回比较难以实现。
  3. 子线程的创建比子进程的创建要快10到100倍。

线程的共享资源:
全局变量
进程指令
大多数数据
打开的文件(描述符)
信号处理函数和信号设置
当前工作目录
用户ID和组ID

线程的非共享,每个线程各自的资源:
线程·ID
寄存器集合,包括程序计数器和栈指针
栈(用于存放局部变量和返回地址)
errno
信号掩码
优先级

头文件
#include<pthread.h>
编译
加上 -lpthread

基本线程函数——创建和终止

pthread_create函数

int pthread_create(pthread * tid, const pthread_attr_t *attr, void *(*func)(void *), void *arg);
//创建新线程,返回0表示创建成功

参数1: 线程的ID指针, 每个线程都有一个线程ID(类型为pthread_t),如果新线程创建成功其ID就通t过tid返回。
参数2:线程属性参数。线程有优先级、初始栈大小等多种属性,可以通过pthread_attr_t类型变量进行设置。默认是NULL.
参数3:新线程开始的函数名,函数类型必须是void *。
参数4:新线程开始函数的参数,类型为void * , 参数可以传递单个变量的指针,也可以传递结构体等指针。

pthread_join函数

int pthread_join(pthread_t * tid, void ** status);
//连接一个线程等待它退出,返回0表示成功

第一个参数是进程号,第二个参数是来自所等待线程的返回值,默认为NULL。

pthread_self函数

pthread_self(void);
//返回自身的线程号

pthread_detach函数

int pthread_detach(pthread_t tid);
//是线程状态为可分离的,线程结束后自己释放

一个线程是可汇合的(joinable)或者可分离的(detached),如果是可汇合的(默认状态是),当线程结束后不会自己释放,线程ID和状态任会保留,只有当其他线程使用pthread_join函数连接它时才能释放。而如果线程状态是可分离的,当线程运行结束后它会自己释放。

pthread_exit函数

void pthread_exit(void * status);
//主动终止线程

在主函数中调用pthread_exit函数可以使父进程等其所有子线程都结束后再结束退出,避免父进程提前退出。

父进程、主线程和其他线程:
进入主函数时,系统会自己建立父进程和主线程,主线程在main函数返回时会使得父进程结束,而如果父进程结束那么进程中所有的线程都会结束(如果有其他子线程没有执行完就会提前终止)。所以要保证主线程等所有其他子进程结束后再退出返回,可以通过sleep()函数或者pthread_exit()函数实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值