Semaphore 使用案例

本文探讨了并发控制与资源分配技术在多线程环境下的应用,具体通过信号量(Semaphore)与锁(Lock)的结合,实现三台打印机的高效共享。介绍了Semaphore的概念及其实例代码,展示了如何利用Semaphore和Lock来模拟三台打印机的并发使用场景,确保每次只有一个线程能够获取并使用打印机,从而避免了资源冲突和死锁情况的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   Semaphore即信号量,可以被多个线程获取,下面是一个具体的例子,和Lock配合使用,模拟有三台打印机,一次允许三个线程使用空闲的打印机,代码如下:

package thread;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created with IntelliJ IDEA.
 * User: malone
 * Date: 14-4-10
 * Time: 上午10:39
 * To change this template use File | Settings | File Templates.
 */
public class SemaphoreDemo {

    public static void main (String[] args) {
        Storge storge = new Storge();
        for (int i = 0; i < 12; i++) {
            new MyThread(storge).start();
        }
    }
}

class Storge {

    private volatile Boolean[] printer;

    private Semaphore semaphore;

    private Lock lock;

    Storge () {
        semaphore = new Semaphore(3);
        printer = new Boolean[3];
        for (int i = 0; i < printer.length; i++) {
            printer[i] = true;
        }
        lock = new ReentrantLock();
    }

    public int getFreePrinter () {
        lock.lock();
        try {
            for (int i = 0; i < printer.length; i++) {
                if (printer[i]) {
                    printer[i] = false;
                    return i;
                }
            }
        } finally {
            lock.unlock();
        }
        return -1;
    }

    public void setPrinter (int i) {
        lock.lock();
        try {
            printer[i] = true;
        } finally {
            lock.unlock();
        }
    }

    public void print () {
        try {
            //获取信号量
            semaphore.acquire();
            int freePrinter = getFreePrinter();
            System.out.println("Thread " + Thread.currentThread().getName() + " 正在使用"  + freePrinter + "号打印机");
            Thread.sleep(1000);
            setPrinter(freePrinter);
            System.out.println("Thread " + Thread.currentThread().getName() + " 释放"  + freePrinter + "号打印机");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            semaphore.release();
        }

    }


}

class MyThread extends Thread {
    private Storge storge;

    MyThread (Storge storge) {
        this.storge = storge;
    }

    public void run () {
        storge.print();
    }

}


 

### MCU 中 Semaphore使用教程 #### 一、信号量的概念及其作用 在多任务操作系统中,多个任务可能需要共享某些有限的资源。为了防止多个任务同时访问同一资源而导致数据不一致或其他错误情况的发生,引入了信号量机制来协调不同任务之间的资源共享。 #### 二、计数型信号量的工作原理 对于计数型信号量而言,在事件发生时通过`give`操作增加其内部计数值;当有任务准备处理该类事件之前,则需调用`take`减少对应的计数值[^2]。这种机制可以有效地控制并发数量以及实现生产者消费者模式下的同步逻辑。 #### 三、互斥型信号量的特点与应用场景 不同于前者的是, 当涉及到临界区保护即确保某段特定代码片段不会被其他任何线程打断执行的时候就要用到互斥锁(Mutex), 它们之间存在显著区别: - 请求和释放必须由同一个任务完成; - 如果尝试在一个未持有mutex的任务里去release它将会导致失败的结果 [^3]. #### 四、FreeRTOS 下创建并运用Semaphore实例说明 下面给出一段基于 FreeRTOS 实现简单信号灯管理系统的 Python伪代码: ```python import freertos as rtos def task_a(): while True: # 尝试获取信号量 if(rtos.xSemaphoreTake(mutex, portMAX_DELAY)): try: print('Task A is running') # Simulate work being done here finally: # Always give the semaphore back when finished with critical section. rtos.xSemaphoreGive(mutex) def setup_system(): global mutex # 创建一个互斥型信号量用于保护公共资源 mutex = rtos.xSemaphoreCreateMutex() if __name__ == '__main__': setup_system() # 启动两个独立运行的任务A 和 B... ``` 上述例子展示了如何利用 FreeRTOS API 来定义一个新的互斥对象,并将其分配给各个竞争相同资源的不同进程/线程间传递以达到安全访问的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值