C++线程 linux

C++线程

  • 一、线程的概念
    • 1. 什么是线程
    • 2. 线程的概念
  • 二、线程的优缺点
    • 1. 线程的优点
    • 2. 线程的缺点
      • (1) 性能损失
      • (2) 健壮性降低
      • (3) 缺乏访问控制
      • (4) 编程难度高
    • 3. 线程异常
  • 三、线程用途
  • 四、linux 线程编写

一、线程的概念

1. 什么是线程

在谈线程之前,我们先看看进程。
C++线程 linux_第1张图片
创建一个进程,我们从0到有创建了很多东西,申请了很多资源。
我们在创建进程时,如果让其他的pcb指向同一个地址空间。我们能不能将代码分成若干个块,让每个pcb执行代码的某一部分。
C++线程 linux_第2张图片
以前我们是一个进程执行,现在我们用多个pcb进行执行。以前我们是串行进行执行代码,现在我们可以并行。这样我们就实现了一个多执行流的结构。
所以每一个test_struct就是一个执行流。这样我们就引出:进程是承担分配系统资源的基本实体
线程:调度的基本单位,线程是进程里面的执行流!!(线程在进程的地址空间内运行)
进程:线程 = 1:n
我们以前学的进程,都是单执行流。也就是说,有进程必有线程。
Linux中,没有真正意义上的线程!线程是用进程模拟的!!
这里的没有线程是linux没有专门的线程数据结构。
所以,linux中的pcb都可以理解为轻量级进程。
但是,一个进程中有多个执行流和多进程是完全不一样的
win为啥不模仿linux?
因为linux出现比win晚,出于工程考虑,win如果改动,则需要大量的人力物力,而且带来的性能提升不会很高。

2. 线程的概念

  1. 在一个程序里的一个执行路线就叫做线程(thread)。
  2. 一切进程至少都有一个执行线程。
  3. 线程在进程内部运行,本质是在进程地址空间内运行。
  4. 在Linux系统中,在CPU眼中,看到PCB都要比传统的进程更加轻量化。
  5. 透过进程的虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

二、线程的优缺点

1. 线程的优点

  1. 创建一个新线程的代价要比创建一个新进程小的多。
  2. 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多。
  3. 线程占用的资源要比进程少很多。
  4. 能充分利用多处理器的可并行数量。
  5. 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务。
  6. 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
  7. I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

2. 线程的缺点

(1) 性能损失

一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。

(2) 健壮性降低

编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。

(3) 缺乏访问控制

进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。

(4) 编程难度高

编写与调试一个多线程程序比单线程程序困难得多。

3. 线程异常

  1. 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着奔溃。
  2. 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。

三、线程用途

  1. 合理的使用多线程,能提高CPU密集型程序的执行效率。
  2. 合理的使用多线程,能提高IO密集型程序的用户体验

四、linux 线程编写

头文件:#include
接口名称:pthread_create
接口参数:
参数1 pthread_t * thread 线程ID
参数2 const pthread_attr_t *attr 线程属性
参数3 void * (*start_routine) 函数指针
参数4 void *arg 函数参数
返回值:返回出错码
C++线程 linux_第3张图片

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<unistd.h>
  4 #include<sys/types.h>                                                                                                                                
  5 void *thread_run(void *arg)
  6 {
     
  7   while(1){
     
  8     printf("i am %s,pid:%d \n",(char*)arg,getpid());
  9     sleep(1);
 10   }
 11 }
 12 int main()
 13 {
     
 14   pthread_t tid;
 15   pthread_create(&tid,NULL,thread_run,(void*)"thread 1");
 16 
 17   while(1){
     
 18     printf("I am main thread!,pid: %d\n",getpid());
 19     sleep(2);
 20   }
 21   return 0;
 22 }
~

C++线程 linux_第4张图片
在这里插入图片描述
LWP:用来标识轻量级线程

你可能感兴趣的:(linux,多线程)