线程和 进程(包括锁)

程序 线程 和程序

  • 程序: 完成特定功能的一系列有序指令集合
    可执行文件
    代码段+数据段

  • 进程:程序的一次动态执行过程
    代码段+数据段+堆栈段+PCB

两者比较

进程程序
动态的数据段
短暂的永久的
堆栈段+PCB

一个进程只能对应一个程序
一个程序可以对应多个进程

进程线程
是资源竞争的基本单位程序执行最小单位
线程共享进程数据,但也有自己的一部分数据:如下

+ 线程ID
+ 一组寄存器 (IP,SP,状态)
+ 栈
+ errno
+ 信号状态
+ 优先级

fork 和创建新线程的区别

  • 当一个进程执行一个fork调用的时候,会创建出进程的一个新的拷贝,新进程将拥有它自己的变量和它自己的PID,这个新的进程运行时间是独立的,它在执行时几乎完全独立于创建它的进程
  • 在进程里面创建一个新线程的时候,新的执行线程会拥有自己的堆栈(因此也就有自己的局部变量),但它要和它的创建者共享局部变量、文件描述符、信号处理器和当前的工作目录状态。

线程的优点

这里写图片描述

线程的缺点

这里写图片描述

线程调度竞争范围

  • 进程竞争范围:各线程在同一进程竞争“被调度的CPU时间”(但不直接和其他进程中的线程竞争)
  • 系统竞争范围:线程直接和系统范围内的其他线程竞争

线程模型
+ N:1 用户线程模型
这里写图片描述
+ 1:1 核心线程模型
+ N:M混合线程模型

pthread_create函数

这里写图片描述

pthread_join函数

调用pthread_join等待一个线程终止,把线程和UNix进程相比,pthread_create类似于fork,pthread_join 则类似于waitpid

进程线程
pid_tthread_t
forkpthread_create
waitpidpthread_join
exitpthread_exit
僵进程僵线程
waitpidpthread_join
pthread_detach
killpthread_cancel

线程结束两种方式:自杀和他杀

自杀
pthread_exit 或是用return

他杀
pthread_cancel

线程的属性

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

并发级别的设置

  • 获取与设置并发级别 : int pthread_setconcurrency(int new_level);
  • int pthread_getconcurrency(void);
  • 仅在N:M线程模型有效,设置并发级别,给内核一个提示:表示提供给定级别数量的核心线程来映射用户线程是高效的。

线程特定数据

  • 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有
  • 但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问
  • POSIX线程库通过维护一定的数据结构来解决这个问题,这个就称为(Thread-specific Data 或TSD)。

自旋锁

  • 自旋锁类似于互斥锁,它的性能比互斥锁要高
  • 自旋锁与互斥锁很重要的一个区别在于,线程在申请自旋锁的时候,线程不会被挂起,他处于忙等待的状态 (适合等待比较小的应用)
    这里写图片描述

读写锁

这里写图片描述

条件变量

为了解决死锁的问题

phread_cond_wait(&g_cond,&g_mutex);

这个函数内部实现了几步机制:
+ 对g_mutex进行解锁
+ 等待条件,直到线程向它发起通知
+ 重新对g_mutex进行加锁操作

 while(1)
   {
    pthread_mutex_lock(&g_mutex);
    while ( nready == 0)
    {

         printf("%d begin wait condition ... \n",num);
         pthread_cond_wait(&g_cond,&g_mutex);
    }
 while(1)
    {
      pthread_mutex_lock(&g_mutex);
      printf("%d begin produce  product ...\n",num);
      ++ nready;

      pthread_cond_signal(&g_cond);
      printf("%d end produce  product ...\n",num);
      printf("%d signal ...\n",num);
      pthread_mutex_unlock(&g_mutex);        
      sleep(5);
    }
pthread_cond_signal函数

向同一个等待条件的线程发起通知,如果没有任何一个线程处理等待条件的状态,这个通知将被忽略

pthread_cond-broad_cast

向所有等待线程发起通知

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿阿三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值