信号量DispatchSemaphore,wait,singal

2023-07-01  本文已影响0人  生命不止运动不息

DispatchSemaphore是一个用于控制并发访问的同步原语,它可以控制同时执行的任务数量。下面是DispatchSemaphore的基本用法:

1、创建DispatchSemaphore对象并指定初始值:
let semaphore = DispatchSemaphore(value: 5)

上述代码创建了一个初始值为5的DispatchSemaphore对象。

2、在需要控制并发的代码块前调用wait()方法获取一个信号量:
semaphore.wait()

如果信号量的值大于零,则会减少信号量的值并继续执行。如果信号量的值为零,则会阻塞当前线程,直到有一个信号量可用为止。

3、在任务完成后调用signal()方法释放一个信号量:
semaphore.signal()

这会增加信号量的值,以便其他等待的任务可以继续执行。

通过适当地调用wait()和signal()方法,可以实现对并发任务数量的控制。

示例代码如下,演示了如何使用DispatchSemaphore来控制并发执行的任务数量为3:

let semaphore = DispatchSemaphore(value: 3)

for i in 1...9 {
    DispatchQueue.global().async {
        semaphore.wait()
        print("Start task \(i)")
        Thread.sleep(forTimeInterval: 2) // 模拟耗时任务
        print("Finish task \(i)")
        semaphore.signal()
    }
}

打印结果如图:


截屏2023-07-02 14.51.33.png

在上述代码中,我们创建了一个初始值为3的DispatchSemaphore对象。然后,我们使用一个循环来创建10个任务,每个任务都会在执行前调用semaphore.wait()获取一个信号量,并在执行完成后调用semaphore.signal()释放一个信号量。

这样,由于信号量的初始值为3,同时只有3个任务可以执行,其他任务会在调用wait()时等待。一旦有任务完成并调用了signal(),等待的任务就可以继续执行。

上一篇 下一篇

猜你喜欢

热点阅读