当前位置: 首页 > wzjs >正文

雅安市建设网站静态网站开发课程网

雅安市建设网站,静态网站开发课程网,天津做网站那家好,百度指数分析大数据扩:typedef三种用法(简化代码编写) 一、线程的控制——互斥和同步 (一)实例引入 1、示例: 运行结果: 两个线程都在运行,出现问题原因:资源竞争(对全局变量都…

扩:typedef三种用法(简化代码编写)

一、线程的控制——互斥和同步

(一)实例引入

1、示例:

 运行结果:

 两个线程都在运行,出现问题原因:资源竞争(对全局变量都进行了读写操作)

 2、扩展:

 

 

注:reg 寄存器,暂存;alu 逻辑计算单元

(1)读数据

 

(2)计算

(3)写数据

 (二)概念

1、互斥===》在多线程中对临界资源的排他性访问。

        临界资源:公共操作的东西(可为变量、设备);

        排他性访问:多线程在同一时刻只能有一个线程进行读或写操作。

2、互斥锁===》保证临界资源的访问控制(锁在系统中本质是结构体)

     使用步骤:     定义互斥锁 ——>初始化锁 ——>加锁 ——>解锁 ——>销毁

        (1)向系统申请锁mutex(在pcb块)约定1没锁,0锁了

        (2)初始化锁

        (3)尝试使用该资源,申请到后用的时候加锁(其它线程要使用该资源尝试解

                锁,解不开锁则进入休眠等待状态)

        (4)用完后解锁释放资源,系统通知,两个线程再次同时竞争资源

        (5)不需要互斥操作后销毁锁

(三)互斥锁相关函数

1、定义锁:pthread_mutex_t mutex;

(1)pthread_mutex_t :互斥锁类型        

(2) mutex:互斥锁变量(创建在pcb块中的东西) 也称内核对象(在内核中被定义

                        的)

2、初始化锁函数:pthread_mutex_init();

形式:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
                  const pthread_mutexattr_t *restrict attr);

功能:将已经定义好的互斥锁初始化。

参数:mutex 要初始化的互斥锁

                   atrr  初始化的值,一般是NULL表示默认锁

返回值:成功 0;失败 非零

3、加锁:pthread_mutex_lock();

函数原型:

        int pthread_mutex_lock(pthread_mutex_t *mutex);

功能:

                用指定的互斥锁开始加锁代码

参数: 

        mutex 用来给代码加锁的互斥锁

返回值:

                成功 0;失败 非零

  加锁后的代码到解锁部分的代码属于原子操作(汇编角度来说多个语句一把走完)
  在加锁期间其他进程/线程都不能操作该部分代码
  如果该函数在执行的时候,mutex已经被其他部分使用则代码阻塞。

4、解锁:pthread_mutex_unlock(); 

函数原型:

        int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能:

        将指定的互斥锁解锁。

        解锁之后代码不再排他访问,一般加锁解锁同时出现。

参数:

        用来解锁的互斥锁

返回值:

        成功 0;失败 非零

注:解锁之后代码不再排他访问,一般加锁解锁同时出现。

5、销毁:pthread_mutex_destroy();

函数原型:

         int pthread_mutex_destroy(pthread_mutex_t *mutex);

功能:

        使用互斥锁完毕后需要销毁互斥锁

参数:

        mutex 要销毁的互斥锁

返回值:

        成功  0; 失败  非零

6、非阻塞锁:pthread_mutex_trylock();

函数原型:

        int pthread_mutex_trylock(pthread_mutex_t *mutex);

功能:

        类似加锁函数效果,唯一区别就是不阻塞(稍后再试),非阻塞锁,CPU占有率较高

参数:

        mutex 用来加锁的互斥锁

返回值:

        成功 0(操作临界资源);非0(稍后再试)

        判断返回值状态(申请成功与否),外加while(1)

适用于有多个资源的情况,一般用阻塞锁居多。

 7、注意事项

(1)上互斥锁的地方不并发;

(2)被保护的临界资源要尽可能小(不要大递归、不要sleep)

8、示例

运行结果:

 

 9、练习

 

//模拟银行取钱#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int WIN = 3;
pthread_mutex_t mutex;void *th(void *arg) {while (1) {pthread_mutex_lock(&mutex);if (WIN > 0) {--WIN;printf("get win\n");pthread_mutex_unlock(&mutex);int ret = rand() % 5 + 1;sleep(ret);pthread_mutex_lock(&mutex);++WIN;printf("2hao我取完钱了\n");pthread_mutex_unlock(&mutex);break;} else {pthread_mutex_unlock(&mutex);}}return NULL;
}int main(int argc, char **argv) {pthread_t tid[10] = {0};int i = 0;pthread_mutex_init(&mutex, NULL);for (i = 0; i < 10; ++i) {pthread_create(&tid[i], NULL, th, NULL);}int n = 0;for (n = 0; n < 10; ++n) {pthread_join(tid[n], NULL);}pthread_mutex_destroy(&mutex);return 0;
}

 二、线程的同步

(一)概念

1、定义:有一定先后顺序的对资源的排他性访问;(同步:互斥的基础上加上顺序)

     同步原因:互斥锁可以控制排他访问但没有次序。

2、信号量(本质是结构体):锁的一种

(1)信号量的定义(申请信号量与同步线程的个数相同)

(2)初始化信号量(信号量状态初值:1该走就走;0等待)

(3)执行体操作

(4)释放的是下一个信号量

 

3、信号量的PV操作

(1)P :申请资源——申请一个二值信号量(值不是1就是0)

(2)V :释放资源——释放一个二值信号量

4、信号量的分类

(1)无名信号量 ——>线程间通信

(2)有名信号量 ——>进程间通信

5、框架

        信号量的定义==》信号量的初始化==》信号量的pv操作==》信号量的销毁

(二)信号量相关函数

1、定义信号量:sem_t sem;

  sem_t                    sem;
   信号量的类型     信号量的变量

2、初始化信号量:sem_init();

函数原型:int sem_init(sem_t *sem, int pshared, unsigned int value);

功能:将已经定义好的信号量赋值;

参数:sem 要初始化的信号量

           pshared = 0 (表示线程间使用信号量);

           pshared != 0 (表示进程间使用信号量);

           value 信号量的初始值,一般无名信号量都是二值信号量(0 1) :

                       0 表示红灯,进程暂停阻塞;

                       1 表示绿灯,进程可以通过执行;

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

3、申请信号量(P操作):sem_wait();

(1)函数原型int sem_wait(sem_t *sem);

(2)功能:判断当前sem信号量是否有资源可用。

                    如果sem有资源(==1),则申请该资源,程序继续运行;

                     如果sem没有资源(==0),则线程阻塞等待,一旦有资源则自动申请资源并

                        继续运行程序。

        :sem申请资源后会自动执行sem=sem-1;

(3)参数:sem 要判断的信号量资源;

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

4、释放信号量(V操作):sem_post();

(1)函数原型:int sem_post(sem_t *sem);

(2)功能:函数可以将指定的sem信号量资源释放;

                    并默认执行,sem = sem+1;

                    线程在该函数上不会阻塞。

(3)参数:sem 要释放资源的信号量;

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

5、销毁:sem_destroy();

(1)函数原型: int sem_destroy(sem_t *sem);

(2)功能:使用完毕将指定的信号量销毁;

(3)参数:sem要销毁的信号量;

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

6、信号量的两种用法示例

(1)同步(互斥+顺序):二值信号量

 

 

(2)互斥:计数信号量

资源个数不是1个时可使用

 

 三、死锁

1、死锁定义

        死锁是指多个进程或线程在竞争资源时,由于互相等待对方释放资源而陷入无限阻

塞的状态。(归根结底是逻辑错误导致的)

2、产生死锁的原因

(1) 因为系统资源不足。

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

 3、产生死锁的四个必要条件(面问)

(1) 互斥条件:一个资源每次只能被一个进程或线程使用。(若死锁可先把阻塞锁换

                                成非阻塞锁找出错误后改回)

(2) 请求与保持条件:一个进程或线程因请求资源而阻塞时,对已获得的资源保持不

                                        放。

(3) 不剥夺条件:进或线程程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程或线程之间形成一种头尾相接的循环等待资源关系。


文章转载自:

http://W9y7n7z4.mrfnj.cn
http://xg39pO1v.mrfnj.cn
http://jymzGvIA.mrfnj.cn
http://ntr4ZXRH.mrfnj.cn
http://h1WOBD6C.mrfnj.cn
http://yHTInk0M.mrfnj.cn
http://4OjVWrqj.mrfnj.cn
http://ehEAj3i6.mrfnj.cn
http://AczkKM9G.mrfnj.cn
http://LTjUM2PB.mrfnj.cn
http://eZfostMR.mrfnj.cn
http://ErVDTz5I.mrfnj.cn
http://gcdoxbQb.mrfnj.cn
http://tmHTzKko.mrfnj.cn
http://1TTEHO4n.mrfnj.cn
http://U0yPpvbW.mrfnj.cn
http://3BX9GZ7e.mrfnj.cn
http://ipk80JFF.mrfnj.cn
http://QcHBTzp5.mrfnj.cn
http://NX1Tupmt.mrfnj.cn
http://1ypvcjet.mrfnj.cn
http://z5EqnTTl.mrfnj.cn
http://2TTD0Wzo.mrfnj.cn
http://DvUPltkh.mrfnj.cn
http://60oTmKfc.mrfnj.cn
http://RF75LdnI.mrfnj.cn
http://FyItbxY3.mrfnj.cn
http://CKwXeGTd.mrfnj.cn
http://OXaKGRTd.mrfnj.cn
http://NSuR9x59.mrfnj.cn
http://www.dtcms.com/wzjs/621028.html

相关文章:

  • 专门做电子书的网站软件开发网站能做seo吗
  • 网站制作公司 沈阳西部数码网站正在建设中是什么意思
  • 网站中的搜索功能怎么做wordpress 需要多大数据库
  • 佛山行业网站建设龙华住房和建设局网站官网
  • 山海关建设局网站wordpress入门
  • 嵌入式培训学费郑州网络seo公司
  • 如皋网站制作500强网站设计
  • 手机怎么做网站服务器吗百度搜索引擎网址格式
  • 什么是seo网站优化自媒体平台注册账号下载
  • 北京网站优化 卓立海创网站 友情链接怎么做
  • 网站建设平台怎么做网站效果图设计
  • 手机模板网站模板免费下载网页制作公司印章怎么弄
  • 怎么做视频平台网站吗编写html的软件有哪些
  • 装潢公司企业网站源码上海开办企业一窗通
  • 网站开发的人怎么样公司如何建设一个网站
  • 网站开发包含的项目和分工win7系统优化大师
  • 合肥商务科技学校网站建设北京网站建设工作室哪家好
  • 网站制作400哪家好网站线上分销平台有哪些
  • 温州做外贸网站做网站什么时候注册商标
  • 24小时二手表网站昆明seo网站排名优化
  • 建立一个公司的网站江苏齐力建设集团网站
  • 四川建设工程交易信息网站衣服定制app
  • 营销型网站深度网wordpress增加侧边栏
  • 西安做网站公司哪家行h5模板免费
  • wordpress分类信息导航谷歌推广优化
  • 重庆璧山网站建设网站建设结构
  • 企业网站源码生成器wordpress qq登录
  • 销售做网站名字找备案网站
  • 阿里云 备案 网站服务内容网页设计实验报告问题讨论
  • 郑州市建设厅官方网站如何修改wordpress的登录密码