首页 > 系统相关 >信号量解决协调进程同步问题(司机与售票员问题)

信号量解决协调进程同步问题(司机与售票员问题)

时间:2023-10-23 22:33:50浏览次数:38  
标签:SemaphoreUtils 进程同步 System 售票员 信号量 println public

  • 问题描述(在日常生活中司机和售票员的行为动作需要满足一定的规则 )

分析并发进程的交互点

1.首先我们将司机和售票员看成是2个进程,他们需要协调配合完成工作
2.我们需要找到进行并发执行过程中的交互点(一个进行肯定要等另一个进程做了才能接着往下做),在这个点上我们需要使用P v操作让他们按照正确的顺序同步执行(如果让其异步执行可能很大可能会出现错误的结果)

  • 我们的期望情况
    要达到上面的目的我们希望是【如果启动车辆在关闭车门之前执行将进行等待】【打开车门在停下车辆之前执行将进行等待】

对于信号量使用的分析

1.从上图中可以看出来在这个过程中有2个规则,也就说明我们的进程有2个交互点需要同步
2.信号量表示可用资源的数量,我们需要他们最开始就可用进入等待状态,就只能将【信号量设置为0】表示没有资源,在另一个进行相应的动作将信号量+1才能进行执行

  • 实现图

    这个代码不能正确运行,原因待查正
  • Driver
package com.os;

public class Driver extends Thread{
    @Override
    public void run() {
        //司机的动作流程
        //1.车辆启动之前需要先关好门
        SemaphoreUtils.P1(SemaphoreUtils.semaphore1);//P
        System.out.println("启动车辆...");
        System.out.println("正常行驶...");
        System.out.println("到站停车...");
        //2.车停下后提示售票员开门
        SemaphoreUtils.V2(SemaphoreUtils.semaphore2);//V
    }
}

  • 售票员
package com.os;

public class TicketSeller extends Thread{

    @Override
    public void run() {
//售票员的动作流程
        System.out.println("关闭车门...");
        //1.关闭车门后提醒司机可用启动车辆
        SemaphoreUtils.V1(SemaphoreUtils.semaphore1);//v操作
        System.out.println("售票...");
        //2.要等车停下才能开门
        SemaphoreUtils.P2(SemaphoreUtils.semaphore2);//p操作
        System.out.println("打开车门...");

    }
}

  • 工具类
package com.os;

//提供互斥锁的方法
public class SemaphoreUtils {
public static int semaphore1 = 0;
    public static int semaphore2 = 0;
    //V操作
    public static void P1( int semaphore){
        while (semaphore<=0){//说明没有资源可用
            //自旋等待中

        }
        semaphore--;//信号量减1(标记资源用完了了
        semaphore1 = semaphore;
        System.out.println("semaphore1 = " + semaphore1);
    }
    //P操作
    public static void V1( int semaphore){
        semaphore++;//(标记资源可用了
        semaphore1 = semaphore;
        System.out.println("semaphore1 = " + semaphore1);
    }


    public static void P2( int semaphore){
        while (semaphore<=0){//说明没有资源可用
            //自旋等待中

        }
        semaphore--;//信号量减1(标记资源用完了了
        semaphore2 = semaphore;
        System.out.println("semaphore2 = " + semaphore2);
    }
    //P操作
    public static void V2( int semaphore){
        semaphore++;//(标记资源可用了
        semaphore2 = semaphore;
        System.out.println("semaphore2 = " + semaphore2);
    }
}
  • 测试类
package com.os;

public class SemaphoreTest {
    public static void main(String[] args) {
        Driver driver = new Driver();
        TicketSeller ticketSeller = new TicketSeller();
        driver.start();
        ticketSeller.start();
    }
}
 

标签:SemaphoreUtils,进程同步,System,售票员,信号量,println,public
From: https://www.cnblogs.com/swtaa/p/17783369.html

相关文章

  • 二值信号量实现互斥锁的功能
    信号量Semaphore的值可以理解为是可用资源的数量,当Semaphore=1的时候表明可用资源数为1,这和互斥锁中每次只能有一个进行可以访问临界区是一个意思,所以当Semaphore=1的信号量也可以用来实现互斥锁信号量的PV操作,和互斥锁的lock和unlock操作基本类似。只不过设置状态变成了s--......
  • CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?
    一、CyclicBarrier和CountDownLatch有什么区别?两者最核心的区别:CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程二、Semaphore(信号量)Sema......
  • 多线程编程同步:Posix信号量
    信号量的定义IPC是进程间通信(interprocesscommunication)的简称。狭义上,IPC主要用于进程间;广义上,IPC可用于进程间或线程间。Posix消息队列、Posix信号量和Posix共享内存区合称为“PosixIPC”.信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段。......
  • linux 内核 ---信号量(semaphore)
    信号量使用说明(1)定义信号量structsemaphoresem;(2)初始化信号量voidsema_init(structsemaphore*sem,intval);该函数初始化信号量,并设置信号量sem的值为val。(3)获得信号量externvoiddown(structsemaphore*sem);externint__must_checkdown_interruptible(st......
  • 实验四 信号量
    使用二值信号量解决多线程售票系统数据错误问题实现代码#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<semaphore.h>intticketAmout=2;//票的数量:全局变量sem_tmutex;//定义信号量mutexvoid*ticketAgent(void*arg){sem_wait(&mut......
  • 信号量机制和pv操作
           ......
  • POSIX信号量
    背景介绍多进程之间的同步机制:信号量。而在多线程编程中,通常更常见的是使用线程之间的同步机制,例如互斥锁、条件变量、信号量等,来实现线程之间的协调和通信。这些机制更适合用于线程级别的同步和通信需求。POSIX信号信号(signal)就是告知某一进程发生了某个事件的通知,有时也称为......
  • Linux内核信号量(semaphore)使用与源码分析
    https://blog.csdn.net/Auris/article/details/107404962一.在Linux内核驱动中使用信号量(semaphore)常规操作步骤:[0].定义信号量结构体变量;structsemaphoresem; [1].初始化信号量变量 voidsema_init(structsemaphore*sem,intn); eg.sema_ini......
  • 20_信号量
    信号量信号量&互斥量:创建、获取、释放、删除信号量用于同步,任务间或者任务和中断间同步;互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁。二值信号量:同步计数信号量:资源使用统计互斥量:互斥信号量其实就是一个拥有优先级继承的二值信号量递归互......
  • 线程同步与进程同步方式
    要注意这里的同步并不是指同时进行的意思,而是按照先后顺序依次进行。首先了解一下同步与互斥的概念:同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系;互斥:多个进程在同一时刻只有一个进程能进入临界区。一、进程同步方式进程同步就是控制多个进程按一......