Linux多线程编程知识点总结(C语言)

  • 线程和进程的差别:
    线程是包含在进程内部的顺序执行流,是进程中的实际运作单位,也是操作系统能够进行调度的最小单位,一个进程可以有单独的内存空间,线程却没有,一条进程可以并发多条线程,每条线程执行不同的任务;
  • 线程和进程之间的关系:
    一个线程只能属于一个进程,而一个进程可以有多个线程,但是至少有一个主线程;
    资源分配给进程的,同一进程的所有线程共享该进程的所有资源;
    线程作为调度和分配的基本单元,进程作为 拥有资源的基本单位;
    创建或撤销进程时系统需要为之分配和回收资源,导致系统的开销大于创建或者撤销线程时的开销;
  • 使用多线程的优势:
    1)方便通信和数据交换(同一进程下的线程共享一个进程下的资源,数据可以直接被其他的线程使用,快捷方便)
    2)可以更高效额利用CPU
  • 多线程标准接口 POSIX Threads,简写为Pthreads:
    可以按照功能划分为四个组:线程管理、互斥量、条件变量和同步
    include <pthread.h>
    编译和链接时需要添加-pthread参数
    LDFLAGS += -pthread
    以下内容将按照多线程的四个功能组进行分别描述,共描述四个功能组:线程管理、互斥量、条件变量和同步;
    搞出蘑菇蛋,挺直腰杆子
  • 线程管理:包含了线程的创建,终止,等待,分离,设置属性等操作
    线程ID和比较 :pthread_self()获取线程的ID,pthread_equal()比较两个线程ID是否相等
  • 创建线程与终止线程
    pthread_create()创建线程
    pthread_edit()终止线程
  • 线程的连接与分离
    要理解线程的连接与分离,首先要理解线程分为分离线程和 非分离线程,分离线程在退出是会释放其资源,非 分离线程在退出之后不会立刻释放资源,需要另一个线程为她调用pthread_join函数或者进程退出时才会释放资源;只有非分离线程才是可以连接的,分离线程在退出时不会报告它的退出状态。通过pthread_detach设置将非分离线程设置为分离线程;
    线程 连接:对一个非分离线程,可以通过pthread_join对分离线程进行 连接,通过将调用线程挂起,知道参数thread指定的 目标线程终止运行为止。
    线程属性:pthread_create函数的第二个参数用于设置线程的属性,包括栈大小,调度策略和 线程状态;通常需要先创建一个属性对象,然后 在属性对象上设置属性的值,再将属性对象传给pthread_create用于创建含有该属性的线程;
    对于属性对象有创建和销毁两个操作;
    线程状态是一种属性对象,分为分离线程和非分离线程两种状态,相关操作有获取线程 状态,设置线程状态;
    线程栈:每个线程都有一个独立的调用栈,在创建线程的时候就已经固定下来了,Linux系统的默认栈大小为8MB,只有主线程的栈会在运行的过程中自动增长,用户可以通过属性对象对象的方式设置和获取栈的大小;获取线程的栈和 设置线程的栈;
  • 线程安全:多线程编程环境之中,多个线程同时调用某些函数可能会产生一些错误的结果,这些函数成为非线程安全函数,如果库函数能够在多个 线程中同时执行并且不会互相干扰,则这个库函数就是线程安全函数。
  • 互斥量:在计算机系统中有很多共享资源不允许多用户并行使用,例如打印机,也被称为:排他性资源,因为一次只能由一个执行流访问,执行流必须以互斥的方式执行访问排他性资源;临界区是必须以互斥的方式执行的代码段,也就是在临界区的范围内只能有一个活动的执行线程。
    互斥量又称为互斥锁,是一种用来保护 临界区的特殊变量,可以处于锁定状态也可以处于解锁状态;如果互斥锁是锁定的,就是某个特定的线程正持有这个 互斥锁;如果没有线程持有这个互斥锁,则该锁就是解锁状态的。每个互斥锁内部都有一个线程等待队列,用于保存等待该互斥锁的线程,当互斥锁处于解锁状态时。
  • 互斥量的操作:创建互斥量和销毁互斥量
  • 互斥量的加锁和解锁:pthreads 中有两个试图锁定互斥量的函数,pthread_mutex_lock()和 pthread_mutex_trylock()。pthread_mutex_lock()函数会一直阻塞到互斥量可用为止,而 pthread_mutex_trylock()则尝试加锁,但通常会立即返回。pthread_mutex_unlock()函数用来释放指定的互斥量。
  • 死锁状态:指的是两个或以上的执行序列在执行的过程中,因为争夺资源而造成的一种互相等待的现象;比如一个线程T1已经锁定了一个资源R1,又想去锁定资源R2,此时另一个线程T2,已经锁定了资源R2,想去锁定资源R1。两个线程都想锁定两个资源,此时就会处于 互相等待。
    死锁的避免:当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生,如果能够确保所有的线程都是按照相同的顺序获得锁,就会避免死锁的现象了。
  • 条件变量:为什么需要条件变量:(当条件达到未达到时,线程A处于休眠,当条件达到的时候,线程A立刻进行响应)
  • 条件变量的创建与销毁
  • 条件变量是与条件测试一起提出的,判断条件是否满足,当不满足是就进行“条件等待”,条件等待函数有:pthread_cond_wait()和pthread_cond_timedwait()参数 cond 是一个指向条件变量的指针,参数 mutex 是一个指向互斥量的指针,线程在调用前应该拥有这个互斥量,当线程要加入条件变量的等待队列时,等待操作会使线程释放这个互斥量。pthread_timedwait()的第三个参数 abstime 是一个指向返回时间的指针,如果条件变量通知信号没有在此等待时间之前出现,等待将超时退出,abstime 是个绝对时间,
  • 通知:当一个线程修改了某参数可能 导致条件变量所关联的条件变成真的时,应该通知一个或者多个等待在条件变量等待队列中的线程。条件通知函数有 pthread_cond_signal()和 pthread_cond_broadcast()函数,其中 pthread_cond_signal 函数可以唤醒一个在条件变量等待队列等待的线程,而 pthread_cond_broadcast函数可以所有在条件变量等待队列等待的线程。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值