news 2026/6/8 10:03:40

跟我一起学“仓颉”编程语言-多线程协调之Semaphore

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跟我一起学“仓颉”编程语言-多线程协调之Semaphore

一、Semaphore

信号量是一种用于管理对共享资源的控制的同步机制。信号量的核心就是一个计数器,它表示可用的资源数量。

获取:当一个线程要访问一个共享资源时,他会调用获取操作,如果信号量计数器大于0,有资源可用,信号量就减少计数器的值,允许线程访问,如果信号量计数器小于0,没有资源可用,线程就会被阻塞,直到计数器大于0.

释放:当线程完成对资源的访问后,就会执行释放的操作,信号量会增加计数器的值,表示资源可用。如果有其他线程因为请求资源而被阻塞,信号量会选择一个或多个线程,解除它们的阻塞状态,允许它们访问资源。

还记得之前在线程安全那里的代码案例嘛,我们用Semaphore来实现

package Study // 导包 import std.sync.* import std.collection.* var counter = 100 // 计数器从1开始 let semaphore = Semaphore(1) let list = ArrayList<Future<Unit>>() main () { for (_ in 0..100) { let future = spawn { // 获取 semaphore.acquire() counter++ // 释放 semaphore.release() } list.add(future) } for (future in list) { future.get() } println(counter) }

在举一个例子,有一个停车场,停车场入口会显示剩余车位,当车进入停车场,车位就减1,当车离开后,车位加1,如果停车场车停满了,其他车必须等待,直到有车离开。

package Study // 导包 import std.sync.* import std.collection.* let count = 3 class Park { Park(private var semaphore: Semaphore) { this.semaphore = semaphore } // 停车 func parkCar() { try { // 获取 semaphore.acquire() println("汽车${Thread.currentThread.id}已停车") // 模拟停车时间 sleep(Duration.second * 5) } catch (_) { println("如果有资源要释放的,需要处理异常") } finally { // 释放 semaphore.release() println("汽车${Thread.currentThread.id}已离开") } } } main () { let park = Park(Semaphore(count)) let list = ArrayList<Future<Unit>>() for (_ in 0..5) { let future = spawn { park.parkCar() } list.add(future) } for (future in list) { future.get() } }

在使用Semaphore需要注意以下几点:

1. 确保每次获取和释放的使用是一致的,必须保证每一个获取都要对应一个释放;

2. 避免死锁,确保获取和释放的顺序一致。

3. 资源清理,确保不在使用的资源被清理,避免因为资源占用而导致的异常

二、小结

本章为大家详细的介绍了仓颉编程语言中多线程协调之Semaphore的内容,下一章,为大家带来多线程练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉服务端开发有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 9:55:15

时间序列建模实战:从平稳性检验到ARIMA与LSTM协同预测

1. 这不是“调个包就完事”的时间序列课&#xff1a;一个真实从业者带你从数据缝里抠出规律 你是不是也试过——下载一份股票收盘价CSV&#xff0c;照着网上教程把 pandas.read_csv() 、 model.fit() 、 model.predict() 三行代码跑通&#xff0c;结果画出来的预测曲线像…

作者头像 李华