多线程------线程的基本概念&创建&终止

一、什么是线程
1、概念
在Linux下进程是承担系统分配资源的基本单位。Linux下的进程称之为轻量级进程。
在一个程序里的一个执行路线就叫做线程。线程就是“一个进程内部的控制序列”(线程是在进程内部运行的)。线程是承担调度的基本单位,一个进程可以有多个线程,它的执行力度比进程更细


注意点:
在Linux中,线程和进程共用一种数据结构(task_struct),Linux并未给线程另设计别的数据结构。Linux中么有真正意义上的线程,它是由进程模拟的
在Windows操作系统中,线程就是真正意义上的线程。每一个线程都有一个TCB,每一个进程则有一个PCB,两者各有自己的数据结构表示

2、特点
因为同一进程的多个线程的共享同一地址空间,因此代码段数据段共享,倘若定义一个函数,在各线程中都可以调用;定义一个全局变量,在各线程中也都可以访问的到

**注:虽然线程对于代码段数据段是共享的,但线程只会执行它该执行的那一部分

* 线程共享的进程的资源和环境:

(1)文件描述符
(2)各种信号的处理方式
(3)当前工作目录
(4)用户id和组id

* 线程独有的数据资源:

(1)线程id:LWP
(2)每个线程都有自己独立的栈
(3)独立的上下文信息(各种寄存器的值、程序计数器、栈指针)
(4)调度的优先级
(5)信号屏蔽字
(6)error变量

3、线程的优缺点
(1)优点

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

(2)缺点

* (1)性能损失
* (2)健壮性降低
* (3)缺乏访问控制
* (4)编程难度提高

二、创建线程
来来来,了解一下:
线程库含少数是由POSIX标准定义的,称之为POSIX thread或者pthread。so链接这些线程函数库的时候要使用编译器命令“-lpthread” 选项

//  函数原型
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void (*start_routine) (void *), void *arg);

// 功能:创建一个新的线程

//参数
          thread:返回线程id
          attr:设置线程的属性,attr为NULL表示默认属性
         start_routine:是个函数地址,线程启动后要执行的函数
         arg:传给线程启动函数的参数

//返回值:成功返回0;失败返回错误码

Makefile
这里写图片描述

代码:
这里写图片描述

运行结果:(朋友们,你们可以自己验证哦!)
这里写图片描述
三、线程终止

终止某个线程有三种方法:

1、在线程函数里return(这种对于主线程不适用,在main函数里面return,相当于调用exit)
2、调用pthread_exit终止自己

pthread_exit函数:终止线程

//函数原型:
#include <pthread.h>
void pthread_exit(void *retval);

//参数:
retval:retval不要指向一个局部变量

//返回值:
没有返回值。同进程一样,线程结束的时候无法返回到它的调用者(也就是自身)

**注意点:
    pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是malloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回指针时线程函数已经退出**

3、一个线程调用pthread_cancel终止同一个进程里的另一个线程

pthread_cancel函数:取消一个执行中的进程

//函数原型
#include <pthread.h>
int pthread_cancel(pthread_t thread);

//参数
thread:线程id

//返回值:
成功返回0,失败返回错误码

猜你喜欢

转载自blog.csdn.net/apt1203jn/article/details/80203327