首页 > 代码库 > Linux线程

Linux线程

线程

  • 线程是CPU调度的基本单位

  • 强调共享,必须有自己的硬件上下文

  • 线程是进程的一个独立执行流,必须有运行时栈

  • 由于同一进程的多个线程共享同一地址空间,因此各线程共享以下进程资源和环境

        ①Text Segment

        ②Data Segment

        ③文件描述符表

        ④每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)

        ⑤当前工作目录

        ⑥进程组ID和组ID

  • 线程大部分有些资源是共享的,但是也有部分是私有的

        ①线程ID(只在线程内部有效)

        ②硬件上下文(用来调度与切换、保存与恢复)

        ③栈空间(私有栈结构)

        ④errno变量

        ⑤信号屏蔽字

        ⑥调度优先级

  • Linux中没有线程,都是用进程模拟实现的,所以Linux下线程也叫轻量级进程(LWP)

    线程产生的原理:父进程fork产生多个子进程,由于没有调用exec函数,子进程共享父进程的地       址空间,多个执行流同时执行代码段中不同的代码。因此可以认为线程是在进程内部运行的。

  • 在Linux下CPU是看不到线程的,只能看到PCB

  • Linux下的进程可以看做只有一个执行流的线程

  • 学习线程分为线程控制(创建、等待、分离、终止)和线程的同步与互斥两部分

  • 终止线程有3种方式

        ①在线程内部return (退出码由用户自定义)

        ②pthread_exit() (退出码由用户自定义)

        ③pthread_cancel() (可以自己把自己取消,被别的线程取消)

  • 线程的分离:

        ①线程属性默认是可结合的,如果没有被分离,则它必须被等待

        ②可主线程分离新线程,也可以新线程主动分离

        ③线程分离后不需要等待

  • 互斥锁

        ①初始化有2种方式:宏和函数

        ②加锁有3种:lock、trylock(非阻塞,直接返回)、unlock

        ③destroy:pthread_mutex_destroy()

  • 死锁分为自死锁和ABBA死锁,产生死锁的条件有4个

        ①互斥使用

        ②不可抢占

        ③请求与保持

        ④循环等待

  • 避免死锁的方法有3种

        ①破坏“不可剥夺”条件

        ②破坏“请求和保持”条件

        ③破坏“循环等待”条件

  • 在Linux中线程函数位于libpthread共享库中,因此编译时要加上-lpthread选项

  • 同步:在互斥的基础上,多个执行流有一定的顺序性,从而让多进程、多线程协同工作

  • 同步在Linux下用条件变量实现


本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1853223

Linux线程