线程同步与线程互斥

一、前情提要

1、获取线程ID

pthreae_self();

功能:获取线程号

返回值:线程ID

2、分离线程函数

int pthread_detach(pthread_t thread);

功能:使线程分离,线程退出时让系统自动回收线程资源

参数:线程ID

子线程在退出的时候,主线程没有给子线程回收资源的话,线程会变成僵尸线程。

使用方式:

1)在主线程中调用pthread_detach(tid);

2)在子线程中调用pthread_detach(pthread_self());

注意:1)如果线程已经设置了分离状态则再调用pthread_join时就会失败

2)pthread_detach与pthread_join如何选择?

当主线程中有希望有阻塞操作时,可以选择调用pthread_join回收线程

当主线程中有循环操作,希望子线程再结束时立马回收线程可以选择pthread_detach设置分离属性

3、取消线程

int pthread_cancel(pthread_t thread);

功能:向指定的线程发送取消请求

参数:thread:线程ID

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

pthread_testcancel()

功能:用于检查取消请求

二、线程同步

1、同步的概念:多个线程按照约定的顺序相互配合完成一件事

2、信号量:通过信号量实现线程之间的同步。信号量是用来决定线程是继续运行还是阻塞等待,它代表某一类资源,它的值代表系统中该资源的数量。信号量是一个受保护的量,只能通过三种操作来访问:初始化、P操作,V操作。其值为非负整数。

3、信号量特性:

P操作(申请资源):信号量的值大于0的时候,可以申请资源,申请成功后信号量的值减一,当信号量等于0的时候,无法申请资源,函数阻塞。

V操作(释放资源):不阻塞,执行到释放操作,信号量的值加一

4、信号量的分类:

1).posix信号量:

a. 无名信号量:数据存储在内存中,通常在线程间使用或父子进程间

函数接口:sem_init\sem_wait\sem_post

b. 有名信号量:数据存储在文件中,在进程间线程间都可以使用

函数接口:sem_open\sem_wait\sem_post\sem_close

2).System V信号量

是信号量的集合,叫信号灯集,属于IPC对象

函数接口:semget\semctl\semop

5、初始化信号量

int sem_init(sem_t *sem,int pshared,ensignes int value);

功能:初始化信号量

参数:sem:要初始化的信号量对象;pshared:信号量的共享范围(0:线程间使用,非0:1进程间使用);value:信号量的初值

返回值:成功:0;失败:-1

6、申请资源

int sem_wait(sem_t *sem);

功能:申请资源(P操作)

参数:sem:信号量对象

返回值:成功:0;失败:-1

注意:在函数进行的过程中,当信号量的值大于0的时候表示有资源可以是有,函数继续执行,当信号量的值等于0的时候表示没有资源可以使用,函数阻塞。

7、释放资源

int sem_post(sem_t *sem);

功能:释放资源(V操作)

参数:同上

返回值:同上

注意:释放一次信号量的值加一,函数不阻塞

三、线程互斥

1、互斥的概念:多个线程访问临界资源时,同一时间只能一个线程访问。(临界资源:多个线程共同访问的数据,一次仅允许一个线程所使用)

2、互斥锁

其实同步相当于另外一种的互斥,反过来说互斥是另一种同步吗?不是,因为互斥这里没有要求要顺序访问,我只是保证了这个资源在访问的时候只有一个线程来访问

通过互斥锁可以实现互斥机制,主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。

互斥锁的操作方式:初始化

申请锁(上锁):阻塞

释放锁(解锁):非阻塞

注意:上锁和解锁需要成对存在

3、互斥锁初始化

int pthread_mutex_init(pthread_mutex_t *restrict mutex, pthread_mutexattr_t *attr)

功能:初始化互斥锁

参数:

mutex:互斥锁

attr:互斥锁属性 // 一般设置为NULL

返回值:成功 0

失败 -1

4、申请互斥锁

int pthread_mutex_lock(pthread_mutex_t *mutex)

功能:申请互斥锁

参数:mutex:互斥锁变量

返回值:成功:0;失败:-1

5、释放互斥锁

int pthread_mutex_unlock(pthread_mutex_t *mutex)

功能:释放互斥锁

参数:同上

返回值:同上

6、销毁互斥锁

int pthread_mutex_destory(pthread_mutex_t *mutex)

功能:销毁互斥锁

参数:同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值