c高级_职坐标day11线程锁和信号量以及屏障
线程显著的特点是:好用,快,但是容易崩,而且是共享同一进程的数据的,一个崩溃,一个进程(一锅都没了,属于是串联式的,蹦一个都不行)
但是对于线程的有序控制,和简单的竞争抑制是必修课程,也就是控制多线程的尽量的有序运行。
1、线程锁:在使用线程锁之后(一般是有竞态得一起用,都得上),可以通过线程的锁来锁定当前线程,
它的本质是:1.1当上锁过后;(大家是一同上锁的,但是只有一把锁,被锁住的人才能去干事儿,其他的人都会停在锁前面,必须得等被锁住的那个人解锁过后,才能有下一个人去被锁,才能去做事儿)其他的线程就抢不到这把锁了,只能被阻塞在锁前面,直到,这个抢到锁的线程解锁(一般来说,谁抢到的锁(相当于上锁了)只能抢到的线程自己解开)后,才能再次去上锁。
(几个要点:
1、当竞争一把锁,锁被抢到,其他就只能等。
2、谁抢到的锁,只能由谁来解。
3、锁被放出来后, 所有的线程只要等在锁前面的都可以抢夺。 )
有了这几个特点过后就可以用线程锁进行简单的有序的控制。
具体流程:
1、pthread_mutex_t mutex;创建锁。
2、pthread_mutex_init(&mutex,NULL);锁初始化
3、pthread_mutex_lock(&mutex) 上锁
4、pthread_mutex_unlock(&mutex)解锁
5、pthread_mutex_destroy(&mutex) 销毁锁
线程信号量:semaphore
流程:
1、sem_t sem;创建信号量
2、sem_init(&sem,0,0)中间一个默认一般为零,如果唯一那么这个文件可用。为零则是在当前进程中的线程间使用,为1则是可以跨进程使用!
3、sem_wait(&sem);等待资源获取,回去成功就往下执行,否则阻塞
4、sem_post(&sem);唤醒
5、sem_destroy(&sem);销毁锁
通过信号量,能让线程较为有序的资源分配和按序唤醒,进而能实现有序的线程运行。
模型:简单介绍模型
第一个模型生产者和消费者
模型就是对现实问题的问题的运作框架提取成模型,用模型思路来解决对应的问题。
生产厂家不能无限制生产,消费者也不能在没东西的时
候消费。所以他们之间是相互促进和抑制的。
生产厂家会根据消费者的情况来进行生产,还有消费者的消费情况也间接促进了生产厂家的生产。
那么当消费诶变慢的时候,生产厂家也应该减慢产能,
同理当消费者消费速度变快的时候生产厂家也应该提升产量和效率。
这样就能不浪费钱刚好合理的消费掉。
这种对现实事物运行逻辑框架的提取,把它的运行逻辑做成一个对应的框架,这个框架就是模型。
屏障:达到指定线程数量后再一起运行。类似于满座的车才会发车一样。
头文件<bits/pthreadtypes.h>

浙公网安备 33010602011771号