Unix线程概念、控制原语、属性

线程:

线程基础概念:

线程在Linux中又称轻量级进程。并且它和进程都有PCB(进程控制块),但是区别是进程的虚拟地址空间是独享的,也就是每个进程都有自己的虚拟地址空间,但是线程的PCB是共享的,在同一个虚拟地址空间里面,每个线程有自己的PCB。虽然每个线程都有自己的PCB,但是从内核的角度来看,进程和线程是一样的,这是因为同一个虚拟地址空间里面的每个线程的PCB指向的内存资源的三级页表是相同的。在Linux下,可以把线程看做是最小的执行单位(进程内部运用多线程完成任务),而进程是最小的分配资源单位(系统以进程为单位来创建,而没有创建一个线程来执行的说法)。实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层的实现都是调用同一个内核函数clone。如果复制对方的地址空间,那就会产生一个”进程”,如果共享对方的地址空间,就产生一个”线程”。进程可以看作是只有一个线程的进程。
因为,linux内核不区分进程和线程,只在用户层面上区分,所以所有有关线程操作的函数都是库函数,而不是系统调用。

线程共享资源:

1.共享文件描述符表(pcb都是指向的同一块物理地址,而文件描述符表存在于pcb中,当然相同)
2.共享信号的处理方式(同理)
3.共享当前工作目录(同理)
4.共享进程ID和组ID(线程还是处于进程中的,所以进程ID和组ID都相同)
5.共享一部分内存地址空间(.text/.data/.bss/heap/共享库)(方便了数据共享和同步)

线程非共享资源:

1.线程id(在同一个进程中,为了标识不同的线程)
2.寄存器的值(由于线程是并发运行的,每个线程有自己不同的运行情况,线程间进行切换时,必须要将原来的线程的寄存器集合的值保存下来,以方便重新切换回来的时候恢复)
3.栈空间(栈空间的独立保证了线程独立运行,不受其它线程的影响)
4.errno变量(同样也是保障线程的独立运行,不受其它线程的影响)
5.信号屏蔽字(同理)
6.调度优先级(线程需要像进程那样被调度,所以需要有被调度的参数,就是优先级)

线程优缺点:

优点:
1.提高了程序的并发性
2.开销比进程小(不用像进程那样,每次都创建自己独有的虚拟空间)
3.数据通信和共享方便(因为线程共享了一部分内存地址空间)
缺点:
1.库函数不如系统调用稳定
2.gdb不支持其调试(gdb的产生远早于线程的加入)
3.对信号的支持不好(同样信号的诞生和线程并不是同一时期)

控制原语:
查看线程ID:

函数原型:pthread_t pthread_self(void)
返回值:返回线程ID,无失败情况(因为就算不创建线程,进程可以看作是只有一个主线程的进程),pthread_t类型在linux系统下是无符号整数,在其它系统可能是结构体。并且线程ID是进程内部的识别标志,所以不同进程间线程ID允许相同。

创建线程:

函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
返回值:成功返回0.失败返回错误号
参数:thread:传出参数,保存系统为我们分配好的线程ID;attr:通常传NULL,表示使用线程默认属性。;start_routine:函数指针,指向线程的主函数,该函数运行结束之后,该线程也结束;arg:线程主函数执行时传入的参数
注意:当调用了pthread_create函数之后,当前的线程会继续向下执行,而新创建的线程会去执行我们传入的start_routine函数,该函数执行结束后,新创建的这个线程也就结束了。

当我们使用gcc编译的关于线程操作的时候,需要额外加上-p

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值