linux编程:线程

Source

线程:

轻量级的进程

进程:

重量级的进程

轻量和重量

主要在于 资源的占有

创建 进程和 创建 线程

进程=PCB+|堆|栈|bss|data|text|

线程=线程ID+程序计数器|寄存器集合|栈

线程----进程-----多任务

有了线程:
1.线程 是CPU调度执行 最小单位//侧重作为执行的单位

2.进程 是资源分配的 最小单位(基本单位)//侧重称为一个资源分配的单位

3.线程 的创建和切换(调度)效率高于进程

4.线程 与进程的关系

线程的存在依附于进程,线程是存在于进程的空间的

进程不存在,则线程也不存在了

多个线程共享了进程资源 代码段 数据段 打开的文件等

eg:

工厂

进程----车间

线程---车间中的工人

linux内核中 实际上 是不区分进程和线程

统一叫任务---task

linux为了支持线程编程----linux thread//thread线程

linux系统设计一套 线程函数库---red hat NPTL线程库

就成了事实上的标准了

线程:

1.线程创建-----pthread_create//posix--标准

2.线程执行

3.线程退出

线程创建:

pthread_create

 #include <pthread.h>

    int pthread_create(pthread_t *thread, //线程id

const pthread_attr_t *attr, //线程属性,NULL默认属=可结合属性(资源回收的方式)

    void * (*start_routine) (void *),  //线程回调函数(执行函数)

void *arg); //arg表示传递给线程执行函数的一个参数

      Compile and link with -pthread.

功能:

创建线程

返回值:

成功 返回0

失败 返回错误码

void *  (*start_routine)  (void *)

基类型*变量名:

void*do_something(arg-->void*)//函数执行函数 函数类型

int add(int a,int b)//函数的类型

     //int (*p)(int,int)

注意:
1.使用线程库时,编译时,需要链接pthread库

gcc thread.c  -lpthread

2.线程创建好之后

 此时 有两个执行流

一个是主函数所在的执行流---主线程

一个是子线程所在的执行流---子/次线程

3.在线程中,线程之间关系是对等

4.线程共享了进程资源

数据段

全局变量

局部变量

堆区变量

因为共享,如果使用的是同样一个变量

那么多个线程之间会有相互影响

5.线程创建好之后,线程的运行顺序也是不确定的

最终都由操作系统决定。

6.线程共享数据方便

如果是想让 多线程相互影响同一个数据,传参,传地址 并且需要做*运算--文件:

如果 多线程使用同一个初值,但是各自操作各自,那么想办法获得值--文件:

练习:

1.定义一个全局变量

 a=1

要求创建两个线程

线程1 让a 每隔1s加1

线程2 让a 每隔1s加2