关于线程的基础函数功能和用法请看:
目录
[2.1.1 定义/初始化一个互斥锁](#2.1.1 定义/初始化一个互斥锁)
[2.2.1 加锁](#2.2.1 加锁)
[2.2.2 解锁](#2.2.2 解锁)
[2.2.3 销毁锁](#2.2.3 销毁锁)
[3 条件变量](#3 条件变量)
[3.1 创建并且初始化一个条件变量](#3.1 创建并且初始化一个条件变量)
[3.1.1 动态创建](#3.1.1 动态创建)
[3.2 没有满足条件阻塞](#3.2 没有满足条件阻塞)
[3.3 满足条件解除阻塞](#3.3 满足条件解除阻塞)
[3.4 销毁](#3.4 销毁)
[4.1 信号量初始化](#4.1 信号量初始化)
[4.2 获取信号量的值](#4.2 获取信号量的值)
[4.3 消耗](#4.3 消耗)
[4.4 释放](#4.4 释放)
[4.5 清理](#4.5 清理)
1、线程间通信
线程间进行通信使用全局变量即可。
信号(同进程)
函数原型:
cs
int pthread_kill(pthread_t thread, int sig);
参数:
thread:线程ID
sig:发送的信号
返回值:成功返回0;
2、线程的同步和互斥
2.1、互斥锁
每一次操作资源的时候,默认去检测锁,如果锁处于加锁状态会等待锁解开,如果锁处于解锁状态,加锁使用,使用完毕后,解锁。
使用流程:
1、定义/初始化一个互斥锁:
cs
pthread_mutex_t mutex;//定义
pthread_mutex_init();//初始化
2、竞争占用互斥锁:
cs
pthread_mutex_lock 上锁
3、释放互斥锁资源:
cs
pthread_mutex_unlock //解锁
4、销毁互斥锁:
cs
pthread_mutex_destroy
2.1.1 定义/初始化一个互斥锁
1-> 动态创建:
cs
pthread_mutex_t mutex;
初始化函数原型:
cs
int pthread_mutex_init(
pthread_mutex_t *mutex,
pthread_mutexattr_t *attr)
参数:1描述锁的变量 pthread_mutex_t mutex;
2指定锁的类型,默认NULL表示创建快速互斥锁
返回值:
成功:0 失败: -1
举例使用:
cs
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
2-> 静态创建
cs
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;//静态创建快速互斥锁
2.2.1 加锁
函数原型:
cs
int pthread_mutex_lock(pthread_mutex_t *mutex);-- 阻塞
参数:mutex 互斥锁
返回值:成功:0,失败:返回错误号
cs
int pthread_mutex_trylock(pthread_mutex_t *mutex);
非阻塞版本,如果mutex参数所指定的互斥锁已经被锁定的话,调用pthread_mutex_trylock 函数不会阻塞当前线程, 而是立即返回一个值来描述互斥锁的状况。
2.2.2 解锁
函数原型:
cs
int pthread_mutex_unlock(pthread_mutex_t *mutex);
参数:mutex 互斥锁
返回值:成功:0;失败:返回错误号
2.2.3 销毁锁
cs
int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数:mutex 互斥锁
注意事项:
在同一个线程中,第一次上锁(lock),没有问题,然后没有解锁(unlock),再一次上锁,会发生阻塞,且会一直阻塞下午。
3 条件变量
条件变量:当一个条件没有满足会阻塞程序,满足条件后可以解除阻塞
3.1 创建并且初始化一个条件变量
3.1.1 动态创建
函数原型:
cs
int pthread_cond_init(
pthread_cond_t *restrict_cond,
const pthread_condattr_t *restrict_attr);
参数:
restrict_cond: 定义一个变量 pthread_cond_t cond
第二个一般为 NULL
静态创建
cs
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//静态创建
3.2 没有满足条件阻塞
函数原型:
cs
int pthread_cond_wait(pthread_cond_t *restrict_cond,
pthread_mutex_t *restrict_mutex);
参数:
restrict_cond: 定义一个变量 pthread_cond_t cond
restrict_mutex: 定义并且初始化好的互斥锁变量
pthread_mutex_t mutex
3.3 满足条件解除阻塞
函数原型:
cs
int pthread_cond_signal(pthread_cond_t *cond)
形参:code -- 条件变量
3.4 销毁
函数原型:
cs
int pthread_cond_destroy(pthread_cond_t *cond);
4、信号量
信号量:本质上是一个非负的整数计数器,用来控制对公共资源的访问
原理:p 操作使 sem 减一,v 操作使 sem 加一。信号量sem的值大于零时,线程具有公共资源的访问权限。
头文件:
cs
#include <semaphore.h>
4.1 信号量初始化
函数原型:
cs
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
sem: 初始化信号量
pshared: 指定为 0
value: 信号量初值
返回值: 成功: 0, 失败 : -1
4.2 获取信号量的值
函数原型:
cs
int sem_getvalue(sem_t *sem, int *sval);
4.3 消耗
函数原型:
cs
int sem_wait(sem_t *sem);
参数:
阻塞 -- p 操作
参数: 信号量的标识符
返回值
成功:0 失败 :-1
非阻塞:
cs
int sem_trywait(sem_t *sem);--非阻塞
4.4 释放
函数原型:
cs
int sem_post(sem_t *sem); -- v 操作
参数:信号量的标识符
返回值:成功:0 失败 :-1
4.5 清理
函数原型:
cs
sem_destroy(sem_t *sem);