C/C++-多线程-LInux

进程:可执行程序的一个正在运行的实例 每一个进程都拥有独立的4G的地址空间。进程之间是相互独立的,一个进程不能直接访问另一个进程的资源。
线程:进程中的一个任务,就称为一个线程。一个进程中可以有多个线程。同一个进程中的线程是共享资源的。不同进程中的线程不能直接进行通信
多线程:在每一个进程中都有一个主线程(main函数所在的线程)。其他的所有线程都是主线程的子线程或者孙子线程。一个主线程可以创建多个子线程。
但是一个子线程只能有一个父线程。主线程一旦结束,则整个进程就结束了。而其他线程结束,不会影响整个进程。

线程操作相关API:
创建线程
pthread_create
#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg)
作用:创建一个新的子线程,然后该子线程会执行start_routine函数
参数:
thread:保存创建的新的子线程的线程号,同一个进程中的每一个线程的线程号是不相同的,但是不同的进程中的线程的线程号可以相同
attr:设置创建的线程的属性 一般设置为NULL,表示使用默认属性
start_rotine:线程的执行函数。也就是线程创建成功之后执行的函数。该参数的类型是一个函数指针。
arg:传递给start_rotine函数的参数

使用线程函数的时候除了需要引入头文件,还需要连接线程的线程库文件
gcc xxx.c -lpthread


现代操作系统是以抢占式的方式管理进程和线程的。也就是说,哪个线程先执行,哪个进程后执行是由操作系统决定的,用户无法决定。只能通过
提高优先级等手段提高线程执行的可能性。

例子:写程序创建一个线程,在主线程中每隔一秒钟输出一个随机数,在子线程中每隔一秒钟从1开始依次输出10000以内的奇数



二进制程序(binaries)是指保存在存储介质上的程序,以给定操作系统和计算机体系结构可以访问的格式编译生成,可以运行但是尚未开始运行。
进程(processes):是操作系统对运行的二进制程序的抽象,包括:加载二进制程序、虚拟内存、内核资源和打开的文件以及关联的用户等。
线程(thread):是进程内的执行单元,具体包括:虚拟处理器、堆栈、程序状态。
也就是说,进程就是正在运行的二进制程序,线程就是操作系统调度器可以调度的最小执行单元。
操作系统会为每个线程分配时间片,一旦某个线程执行的时间片用完了,则系统就会挂起该线程,让其他线程执行。

pthread_join函数
#include <pthread.h>

int pthread_join(pthread_t thread, void **retval)
作用:让当前线程等待指定的线程结束,并且当等待的线程结束之后就回收该线程的资源
参数:
thread:要等待的线程的线程id
retval:接收等待的线程结束时的返回值
根据等待的线程是否结束,可能有两种情况:
1 等待的线程尚未结束,则pthread_join会陷入阻塞
2 等待的线程已经结束,则pthread_join会将线程的返回值(void *类型)存放到retval指针所指向的位置,并且回收该线程的资源。

主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。

 

 

线程同步:

为了实现数据同步的效果,则对于共享资源可以使用互斥量的技术实现。
1 针对共享资源锁定互斥量
2 访问共享资源
3 对互斥量解锁

一旦某一个线程对互斥量加锁了,则其他线程对互斥量加锁的请求都会失败

互斥量:
pthread_mutex_t mutex;

使用互斥量的步骤如下:
1 创建一个互斥量对象
pthread_mutex_t mutex;
2 对互斥量进行初始化操作
2.1 静态初始化
mutex = PTHREAD_MUTEX_INITIALIZER;

2.2 动态初始化
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr)
参数:
mutex:指定要进行初始化的互斥量的指针
attr:指定互斥量的属性值,一般设置为NULL,使用默认的属性值进行初始化

3 对互斥量进行加锁操作
pthread_mutex_lock(pthread mutex_t* mutex)

4 操作共享资源

5 对互斥量进行解锁操作
pthread_mutex_unlock(pthread mutex_t* mutex)
6 销毁互斥量
pthread_mutex_destroy(pthread_mutex_t *mutex)
参数:mutex 指定要销毁的互斥量

线程同步: 多线程:  pthread_create  pthread_join

为了实现数据同步的效果,则对于共享资源可以使用互斥量的技术实现。1 针对共享资源锁定互斥量2 访问共享资源3 对互斥量解锁
一旦某一个线程对互斥量加锁了,则其他线程对互斥量加锁的请求都会失败
  互斥量:   pthread_mutex_t  mutex;
使用互斥量的步骤如下:1 创建一个互斥量对象pthread_mutex_t  mutex;2 对互斥量进行初始化操作  2.1 静态初始化  mutex = PTHREAD_MUTEX_INITIALIZER;
  2.2 动态初始化  #include <pthread.h>  int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr) 参数: mutex:指定要进行初始化的互斥量的指针 attr:指定互斥量的属性值,一般设置为NULL,使用默认的属性值进行初始化
3 对互斥量进行加锁操作 pthread_mutex_lock(pthread mutex_t* mutex)
4 操作共享资源
5 对互斥量进行解锁操作pthread_mutex_unlock(pthread mutex_t* mutex)6 销毁互斥量pthread_mutex_destroy(pthread_mutex_t *mutex)参数:mutex 指定要销毁的互斥量

6 销毁互斥量
pthread_mutex_destroy(pthread_mutex_t *mutex)
参数:mutex 指定要销毁的互斥量

posted @ 2021-01-10 09:37  KnowledgePorter  阅读(57)  评论(0)    收藏  举报