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

锁-读写锁-Swift

实现一 pthread_mutex_t:

ReadWriteLock/Sources/ReadWriteLock at main · SomeRandomiOSDev/ReadWriteLock · GitHub

https://swiftpackageindex.com/reers/reerkit/1.0.39/documentation/reerkit/readwritelock/ 

//
//  Copyright © 2022 reers.
//
//  Permission is hereby granted, free of charge, to any person obtaining a copy
//  of this software and associated documentation files (the "Software"), to deal
//  in the Software without restriction, including without limitation the rights
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//  copies of the Software, and to permit persons to whom the Software is
//  furnished to do so, subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be included in
//  all copies or substantial portions of the Software.
//
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//  THE SOFTWARE.#if canImport(Darwin)
import Darwin/// ReerKit: Represents a reader-writer lock. Note that this implementation is not recursive.
public final class ReadWriteLock {private var readMutex = pthread_mutex_t()private var writeMutex = pthread_mutex_t()private var readCount: UInt = 0public init() {pthread_mutex_init(&readMutex, nil)pthread_mutex_init(&writeMutex, nil)}deinit {pthread_mutex_destroy(&readMutex)pthread_mutex_destroy(&writeMutex)}public func readLock() {pthread_mutex_lock(&readMutex)defer { pthread_mutex_unlock(&readMutex) }if readCount == 0 {pthread_mutex_lock(&writeMutex)}readCount += 1}/// ReerKit: Returns true if the lock was succesfully locked and false if the lock was already locked.@discardableResultpublic func tryReadLock() -> Bool {pthread_mutex_lock(&readMutex)defer { pthread_mutex_unlock(&readMutex) }let success = (readCount == 0)? pthread_mutex_trylock(&writeMutex) == 0: trueif success {readCount += 1}return success}public func readUnlock() {pthread_mutex_lock(&readMutex)defer { pthread_mutex_unlock(&readMutex) }if readCount > 0 {readCount -= 1if readCount == 0 {pthread_mutex_unlock(&writeMutex)}}}public func writeLock() {pthread_mutex_lock(&writeMutex)}/// ReerKit: Returns true if the lock was succesfully locked and false if the lock was already locked.@discardableResultpublic func tryWriteLock() -> Bool {return pthread_mutex_trylock(&writeMutex) == 0}public func writeUnlock() {pthread_mutex_unlock(&writeMutex)}public func readAround<Result>(_ execute: () throws -> Result) rethrows -> Result {readLock()defer { readUnlock() }return try execute()}public func writeAround<Result>(_ execute: () throws -> Result) rethrows -> Result {writeLock()defer { writeUnlock() }return try execute()}
}#endif

实现二 NSLock:

class ReadWriteLockTT {private let readLock = NSLock()private let writeLock = NSLock()private var readersCount = 0func read() {readLock.lock()readersCount += 1if readersCount == 1 {writeLock.lock()}readLock.unlock()}func readUnlock() {readLock.lock()readersCount -= 1if readersCount == 0 {writeLock.unlock()}readLock.unlock()}func write() {writeLock.lock()}func writeUnlock() {writeLock.unlock()}func test() {let rwLock = ReadWriteLockTT()//        // 模拟多个读操作线程
//        DispatchQueue.concurrentPerform(iterations: 100) { _ in
//            rwLock.read()
//            // 这里执行读取共享资源的代码逻辑
//            print("执行读取操作")
//            rwLock.readUnlock()
//        }
//
//        // 模拟写操作线程
//        DispatchQueue.global().async {
//            rwLock.write()
//            // 这里执行写入共享资源的代码逻辑
//            print("执行写入操作")
//            rwLock.writeUnlock()
//        }var value = 0// 读线程DispatchQueue.global().async {for _ in 0..<20000 {
//                rwLock.read { value in
//                    print("Read value: \(value)")
//                }rwLock.read()// 这里执行读取共享资源的代码逻辑print("执行读取操作==\(value)")rwLock.readUnlock()}}// 写线程DispatchQueue.global().async {for i in 1...5 {sleep(1)  // 模拟写操作的延迟
//                rwLock.write(value: i)rwLock.write()// 这里执行写入共享资源的代码逻辑value += 1print("执行写入操作==\(value)")rwLock.writeUnlock()//                print("Written value: \(i)")}}DispatchQueue.global().asyncAfter(deadline: .now() + 200.0) {print("打印完成")}sleep(200)}
}

实现三 pthread_rwlock_t :

swift-design-patterns/Concurrency Design Patterns/ReadWriteLock/ReadWriteLock.md at main · eleev/swift-design-patterns · GitHub

import Foundationclass ReadWriteLock {private var rwlock = pthread_rwlock_t()init() {pthread_rwlock_init(&rwlock, nil)}deinit {pthread_rwlock_destroy(&rwlock)}func read<T>(_ closure: () -> T) -> T {pthread_rwlock_rdlock(&rwlock)defer { pthread_rwlock_unlock(&rwlock) }return closure()}func write(_ closure: () -> Void) {pthread_rwlock_wrlock(&rwlock)defer { pthread_rwlock_unlock(&rwlock) }closure()}
}let readWriteLock = ReadWriteLock()// Reading data with a read lock
let data = readWriteLock.read { () -> Data in// Read shared data herereturn sharedData
}// Writing data with a write lock
readWriteLock.write {// Modify shared data heresharedData = newData
}

实现四 NSRecursiveLock 递归锁:

TODO:

相关文章:

锁-读写锁-Swift

实现一 pthread_mutex_t&#xff1a; ReadWriteLock/Sources/ReadWriteLock at main SomeRandomiOSDev/ReadWriteLock GitHub https://swiftpackageindex.com/reers/reerkit/1.0.39/documentation/reerkit/readwritelock/ // // Copyright © 2022 reers. // // Pe…...

Kafka如何保证消息可靠?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何保证消息可靠&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka如何保证消息可靠&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka通过多种机制来确保消息的可靠性&#xff0c;主要包…...

5.10【机器学习】

如果FLAG的画&#xff0c;就是已经有模型了&#xff0c;不然就新建一个模型&#xff0c;通过TORCH方法 在训练的时候&#xff0c;如果TRAIN的话就是训练&#xff0c;不然就是预测 forward前向预测出来一个结果&#xff0c;就是1234 在train方法里&#xff0c;进行多轮迭代&am…...

[白月黑羽]关于仿写股票数据软件题目的解答

原题&#xff1a; 对应问题视频&#xff1a; 实现的效果 不同点 实现的作品和原题要求的不同点 题目要求爬虫获取数据&#xff0c;作品中是调库获取所有股票历史数据实时数据使用爬虫的方式爬取指定股票的数据&#xff0c;需要实时更新&#xff0c;我做了修改&#xff0c;改…...

详解LZ4文件解压缩问题

详解LZ4文件解压缩问题 一、LZ4文件解压缩方法1. 使用LZ4命令行工具2. 使用Python库3. 使用第三方工具4. 在线解压工具 二、常见问题及解决方法1. 解压显示文件损坏2. 解压后文件大小异常 三、总结 LZ4是一种快速的压缩算法&#xff0c;广泛应用于需要实时压缩和解压缩大文件的…...

vue项目中单独文件的js不存在this.$store?.state怎么办

在Vue项目中&#xff0c;如果你在单独的文件&#xff08;比如插件、工具函数等&#xff09;中遇到this.$store不存在的情况&#xff0c;这通常是因为this上下文不指向Vue实例&#xff0c;或者Vuex store没有被正确地注入到Vue实例中。以下是几种可能的解决方案&#xff1a; 确保…...

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么&#xff1f; PR&#xff0c;全称Pull Request&#xff08;拉取请求&#xff09;&#xff0c;是一种非常重要的协作机制&#xff0c;它是 Git 和 GitHub 等代码托管平台中常见的功能&#xff0c;被广泛用于参与社区贡献&#xff0c;从而促进项目的发展。 PR的整个过…...

Java函数式编程【二】【Stream的装饰】【中间操作】【map映射器】【摊平映射器flatMap】

一、Java的Stream流式编程中的中间操作 Java的Stream流式编程中&#xff0c;中间操作是对数据流进行处理的一种方式&#xff0c;这些操作通常返回流对象本身&#xff0c;以便可以链接更多的操作。以下是一些常见的中间操作&#xff1a; filter(Predicate predicate) - 用于通过…...

树莓派明明安装了opencv和numpy,却找不到

当然不止树莓派&#xff0c;配置python环境都可能存在这个问题 可能是因为安装的 numpy 或者 opencv 版本与 Python 的包路径不匹配。下面是问题的常见原因及解决方法&#xff1a;【方法一和二优先考虑】 原因分析 多版本 Python 环境冲突&#xff1a; 树莓派上可能有多个版本…...

numpy.float8不存在;Python中,实现16位浮点数

目录 python中矩阵的浮点数存储 numpy.float8不存在 Python中,实现16位浮点数 实现 float16 关于 float8 python中矩阵的浮点数存储 在Python中,矩阵通常是通过嵌套列表(list of lists)、NumPy数组(numpy.ndarray)或其他类似的数据结构来表示的。矩阵中存储的数值所…...

Redis集群配置 (不使用docker 部署)

1. Redis集群简介 1.1 什么是Redis集群 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务&#xff0c;提高整体性能和可靠性。根据搭建的方式和集群的特性&#xff0c;Redis集群主要有三种模式&…...

HTML5系列(7)-- Web Storage 实战指南

前端技术探索系列&#xff1a;HTML5 Web Storage 实战指南 &#x1f5c4;️ 致读者&#xff1a;本地存储的新纪元 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 中的 Web Storage 技术&#xff0c;这是一个强大的本地存储解决方案&#xff0c;让我们能…...

【在Linux世界中追寻伟大的One Piece】读者写者问题与读写锁

目录 1 -> 读者写者问题 1.1 -> 什么是读者写者问题 1.2 -> 读者写者与生产消费者的区别 1.3 -> 如何理解读者写者问题 2 -> 读写锁 2.1 -> 读写锁接口 3 -> 读者优先(Reader-Preference) 4 -> 写者优先(Writer-Preference) 1 -> 读者写者…...

用到动态库的程序运行过程

当我们写好了一段代码然后编译运行后会生成可执行文件&#xff0c;该文件会存在磁盘的当前目录下&#xff0c;而当我们开始运行这段程序时&#xff0c;操作系统&#xff08;加载器&#xff09;需要将其从磁盘加载进内存然后执行相关操作&#xff0c;而对于用到动态库的程序&…...

类型转换与IO流:C++世界的变形与交互之道

文章目录 前言&#x1f384;一、类型转换&#x1f388;1.1 隐式类型转换&#x1f388;1.2 显式类型转换&#x1f381;1. C 风格强制类型转换&#x1f381;2. C 类型转换操作符 &#x1f388;1.3 C 类型转换操作符详解&#x1f381;1. static_cast&#x1f381;2. dynamic_cast&…...

Pytorch使用手册- TorchVision目标检测微调Tutorial的使用指南(专题十二)

这篇教程的目标是对一个预训练的 Mask R-CNN 模型进行微调,应用于 Penn-Fudan 行人检测与分割数据集。该数据集包含 170 张图像,里面有 345 个行人实例,我们将通过这个教程来演示如何使用 torchvision 中的新特性,训练一个面向自定义数据集的目标检测和实例分割模型。 注意…...

人工智能机器学习算法分类全解析

目录 一、引言 二、机器学习算法分类概述 &#xff08;一&#xff09;基于学习方式的分类 1. 监督学习&#xff08;Supervised Learning&#xff09; 2. 无监督学习&#xff08;Unsupervised Learning&#xff09; 3. 强化学习&#xff08;Reinforcement Learning&#xf…...

Linux 35.6 + JetPack v5.1.4@DeepStream安装

Linux 35.6 JetPack v5.1.4DeepStream安装 1. 源由2. 步骤Step 1 安装Jetpack 5.1.4 L4T 35.6Step 2 安装依赖组件Step 3 安装librdkafkaStep 4 安装 DeepStream SDKStep 5 测试 deepstream-appStep 6 运行 deepstream-app 3. 总结3.1 版本问题3.2 二进制help 4. 参考资料 1. …...

图数据库 | 11、图数据库架构设计——高性能图存储架构(下)

在上篇内容中&#xff0c;老夫着重讲了高性能图存储系统的特点&#xff0c;咱们继续往下讲重点——高性能存储架构的设计思路&#xff01;&#xff01; 2.高性能存储架构设计思路 首先呢&#xff0c;存储架构以及核心数据结构的设计思路通常围绕如下4个维度来进行&#xff1a…...

【HTTP】HTTP协议

一个Web Server就是个服务器软件&#xff08;程序&#xff09;&#xff0c;或者是运行这个服务器软件的硬件&#xff08;计算机&#xff09;&#xff0c;其主要功能是通过HTTP协议与客户端进行通信&#xff0c;来接收&#xff0c;存储&#xff0c;处理来自客户端的HTTP请求&…...

GME-Qwen2-VL-2B-Instruct图文检索教程:消费级GPU(RTX 3090/4090)适配指南

GME-Qwen2-VL-2B-Instruct图文检索教程&#xff1a;消费级GPU&#xff08;RTX 3090/4090&#xff09;适配指南 1. 前言&#xff1a;为什么需要本地图文匹配工具 在日常工作中&#xff0c;我们经常遇到这样的需求&#xff1a;给出一张图片&#xff0c;需要从多个文本描述中找到…...

DamaiHelper全能抢票王:如何实现99%成功率的自动抢票攻略

DamaiHelper全能抢票王&#xff1a;如何实现99%成功率的自动抢票攻略 【免费下载链接】damaihelper 支持大麦网&#xff0c;淘票票、缤玩岛等多个平台&#xff0c;演唱会演出抢票脚本 项目地址: https://gitcode.com/gh_mirrors/dam/damaihelper 你是否曾经因为手速不够…...

强化学习在软件开发反馈优化中的应用与实践

1. 项目背景与核心价值在软件工程实践中&#xff0c;开发者常常面临一个典型困境&#xff1a;如何从大量看似无关的反馈信息中提取有效信号来优化开发流程&#xff1f;这个问题在持续集成、自动化测试和代码审查等场景中尤为突出。传统方法通常依赖人工定义规则或简单统计指标&…...

【Java等保四级合规性红宝书】:覆盖Spring Boot 3.x + JDK 17 + 国密SM4/SM2全栈适配,含32份可直接提交的等保材料模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Java等保四级合规性全景认知 等保四级是我国网络安全等级保护制度中最高级别的安全要求&#xff0c;适用于涉及国家安全、社会秩序和公共利益的核心信息系统。对于Java技术栈构建的关键业务系统&#x…...

暗黑破坏神2存档编辑器:5步掌握游戏数据修改的完整指南

暗黑破坏神2存档编辑器&#xff1a;5步掌握游戏数据修改的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2中反复刷装备而苦恼吗&#xff1f;想快速测试不同职业build却不想投入数百小时&#xff1f;d…...

使用 Metaflow、AWS 和 Weights Biases 优化物体检测

原文&#xff1a;towardsdatascience.com/streamlining-object-detection-with-metaflow-aws-and-weights-biases-b44a14cb2e11?sourcecollection_archive---------1-----------------------#2024-07-19 如何为物体检测创建生产级管道 https://medium.com/ed.izaguirre?sour…...

三步秘籍:如何用127行代码轻松保存百度文库文档?

三步秘籍&#xff1a;如何用127行代码轻松保存百度文库文档&#xff1f; 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 还在为百度文库的付费文档而烦恼吗&#xff1f;每次找到心仪的资料&#x…...

告别混乱:用TwoSampleMR包高效整理FinnGen的GWAS数据,为孟德尔随机化分析做准备

告别混乱&#xff1a;用TwoSampleMR包高效整理FinnGen的GWAS数据&#xff0c;为孟德尔随机化分析做准备 孟德尔随机化&#xff08;MR&#xff09;分析已成为探索因果关系的利器&#xff0c;但许多研究者在第一步——数据预处理上就栽了跟头。FinnGen数据库作为北欧人群GWAS数据…...

PHP 8.9错误处理新范式(RFC #927深度落地版):从全局异常捕获到上下文感知型错误抑制

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHP 8.9错误处理新范式的演进逻辑与设计哲学 PHP 8.9&#xff08;前瞻版本&#xff0c;基于社区RFC草案与PHP内核演进趋势&#xff09;并未作为正式发布版存在&#xff0c;但其错误处理机制的演进逻辑已…...

利用Taotoken按token计费特性为按需调用的微服务优化成本

利用Taotoken按token计费特性为按需调用的微服务优化成本 1. 微服务架构中的大模型成本挑战 在构建基于大模型的微服务架构时&#xff0c;传统计费模式往往成为成本优化的瓶颈。常见的包月订阅或按调用次数计费方式难以匹配实际业务流量的波动性&#xff0c;导致资源闲置或超…...