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

深入网站开发和运维京东无代码网站开发平台

深入网站开发和运维京东,无代码网站开发平台,查互做蛋白的网站,网站开发及建设目录 一、信号量定义 二、信号量种类 三、信号量操作 3.1 P操作 3.2 V操作 四、信号量的代码实现 4.1 信号量创建,初始化 4.2 销毁信号量 4.3 p操作 4.4 v操作 五、使用PV操作代码实现 5.1 d.c 5.2 e.c 一、信号量定义 信号量是一种用于同步多线程或进…

目录

一、信号量定义

二、信号量种类

三、信号量操作

3.1 P操作

3.2 V操作

四、信号量的代码实现

4.1 信号量创建,初始化

4.2 销毁信号量

4.3 p操作

4.4 v操作

五、使用PV操作代码实现

5.1 d.c 

5.2 e.c


一、信号量定义

信号量是一种用于同步多线程或进程之间的机制,用于控制对共享资源的访问。信号量可以用来保护临界区,防止多个线程同时访问某个共享资源导致数据不一致或竞争条件的发生。

二、信号量种类

信号量是用来实现进程之间的同步和互斥的一种机制。信号量种类主要分为两种:

  1. 二进制信号量(Binary Semaphore):也称为互斥信号量,只能取两个值,通常是0和1。用于实现互斥访问共享资源(互斥锁(Mutex)),保证同一时间只有一个线程访问共享资源。

  2. 计数信号量(Counting Semaphore):可以取多个值,用来进行进程间的同步。用于管理有限数量的共享资源,允许多个线程同时访问资源,但访问数量有限制。它可以表示一定数量的资源可用或者表示某种事件发生的次数。

除了这两种主要的信号量种类,还有一些其他类型的信号量,如忙等待信号量、无忙等待信号量、实时信号量等,这些信号量种类可以根据具体的应用场景和需求进行选择和使用。

三、信号量操作

信号量操作通常包括两种:P操作和V操作。

3.1 P操作

        1.申请资源。

        2.如果信号量的值大于 0,则将其减 1,表示成功获取资源。

        3.如果信号量的值为 0,则线程进入等待状态,直到信号量的值大于 0。

3.2 V操作

        1.释放资源。

        2.将信号量的值加 1,表示释放一个资源。

        3.如果有线程因等待该信号量而阻塞,V 操作会唤醒其中一个线程。

临界资源:同一时刻值运行一个进程访问的资源。

临界区:访问临界资源的代码段。 

四、信号量的代码实现

4.1 信号量创建,初始化

sem_init()

static int semid = -1;void sem_init()
{semid = semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);//全新创建一个信号量if(semid==-1)//如果失败,说明已经创建,直接获取id即可{semid=semget((key_t)1234,1,0600);//获取别人创建的信号量if(semid==-1){printf("semget err\n");return;}}else{union semun a;a.val=1;if( semctl(semid,0,SETVAL,a) == -1){printf("semctl init err\n");}}
}

4.2 销毁信号量

sem_destroy()

void sem_destroy()
{if(semctl(semid,0,IPC_RMID) == -1){printf("semctl rm err\n");}
}

4.3 p操作

sem_p()

void sem_p()
{struct sembuf buf;buf.sem_num = 0;buf.sem_op = -1;//pbuf.sem_flg = SEM_UNDO;if(semop(semid,&buf,1) ==-1){printf("p err\n");}
}

4.4 v操作

sem_v()

void sem_v()
{struct sembuf buf;buf.sem_num = 0;buf.sem_op = 1;//vbuf.sem_flg = SEM_UNDO;if(semop(semid,&buf,1) ==-1){printf("v err\n");}
}

五、使用PV操作代码实现

5.1 d.c 

#include"sem.h"int main()
{sem_init();for(int i=0;i<5;i++){sem_p();printf("A");fflush(stdout);int n=rand()%3;sleep(n);printf("A");fflush(stdout);sem_v();n=rand()%3;sleep(n);}
}

5.2 e.c

下面的示例是程序通过信号量来保证在打印字符'B'时不会有多个线程或进程同时执行,从而避免出现混乱。

#include"sem.h"int main()
{sem_init();for(int i=0;i<5;i++){sem_p();printf("B");fflush(stdout);int n=rand()%3;sleep(n);printf("B");fflush(stdout);sem_v();n=rand()%3;sleep(n);}sleep(10);sem_destroy();
}

编译通过后,运行结果如下:

http://www.dtcms.com/wzjs/260407.html

相关文章:

  • 装修效果图软件app哪个好临沧seo
  • 免费搭建私人网站免费网页空间到哪申请
  • 唐山网站建设冀icp备外链发布
  • 网站建设项目设计的图片太原网站开发
  • 建设网站需要虚拟空间制作企业网站
  • 用户体验比较好的网站卢松松外链工具
  • 仙居网站开发体育热点新闻
  • 广州越秀区房价网络优化大师手机版
  • 网站栏目内链怎么做百度推广靠谱吗
  • ps6做网站点哪里保存快手刷评论推广网站
  • 个人工作室创业项目宁波专业seo服务
  • 做微信公众号的是哪个网站吗百度品牌广告
  • 一步步教你做电商网站网络营销的产品策略
  • 重庆免费发布信息网站新网站百度收录
  • 做网站的必要性网络营销有哪些主要功能
  • 杭州精品网站建设公司哈尔滨关键词排名工具
  • 免费制作logo的软件有哪些手机优化大师为什么扣钱
  • 页面设计漂亮的网站360优化大师官方官网
  • dw怎么做网站布局网络营销软件网站
  • 外国人学做中国菜 网站关键词排名零芯互联关键词
  • b站推广网站400找营销推广团队
  • 平邑网站建设google中文搜索引擎入口
  • 投票网站如何做快速排名软件哪个好
  • 滁州市建设工程协会网站最近新闻大事件
  • 政务网站集约化建设要求微信推广方案
  • 公众号编辑整站seo定制
  • github做自己的网站搜索引擎优化关键字
  • 北京科兴中维新冠疫苗最新消息seo网站推广可以自己搞吗
  • 网站制作前景百度统计怎么使用
  • lamp 做网站网站排名怎么做