首页 > 系统相关 >有关IOS内存读写冲突

有关IOS内存读写冲突

时间:2023-04-05 14:22:44浏览次数:37  
标签:return vmStat1 读写 IOS host let 内存 size MemoryLayout

有关IOS内存读写冲突

在写内存相关代码时,获取已使用内存代码中报错

let hostPort: mach_port_t = mach_host_self()
        var host_size = mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride / MemoryLayout<integer_t>.stride)
        var pagesize: vm_size_t = 0
        host_page_size(hostPort, &pagesize)
        var vmStat1: vm_statistics = vm_statistics_data_t()
        let status: kern_return_t = withUnsafeMutableBytes(of: &vmStat1) {
            let boundPtr = $0.baseAddress?.bindMemory(to: Int32.self, capacity: MemoryLayout.size(ofValue: vmStat1) / MemoryLayout<Int32>.stride)
            return host_statistics(hostPort, HOST_VM_INFO, boundPtr, &host_size)
        }
        if status == KERN_SUCCESS {
            let usedMemory = Int64(vm_size_t(vmStat1.active_count + vmStat1.inactive_count + vmStat1.wire_count) * pagesize)

            return usedMemory
        } else {
            print("Failed to get Virtual memory inforor")
            return 0
        }

这一段代码报错

let status: kern_return_t = withUnsafeMutableBytes(of: &vmStat1) {
            let boundPtr = $0.baseAddress?.bindMemory(to: Int32.self, capacity: MemoryLayout.size(ofValue: vmStat1) / MemoryLayout<Int32>.stride)
            return host_statistics(hostPort, HOST_VM_INFO, boundPtr, &host_size)
        }

WX20230331-091708_2x

Overlapping accesses to 'vmStat1', but modification requires exclusive access; consider copying to a local variable

对“vmStat1”的重叠访问,但修改需要独占访问权限;考虑复制到局部变量

看了一下

withUnsafeMutableBytes(of: &vmStat1)这里是用了inout关键字

@inlinable public func withUnsafeMutableBytes<T, Result>(of value: inout T, _ body: (UnsafeMutableRawBufferPointer) throws -> Result) rethrows -> Result

相当于将vmStat1的指针传了进去,拿到了vmStat1的写权限

而下一段代码

let boundPtr = $0.baseAddress?.bindMemory(to: Int32.self, capacity: MemoryLayout.size(ofValue: vmStat1) / MemoryLayout<Int32>.stride)又拿到了vmStat1的读权限

而内存访问冲突:对同一块内存,同时进行读写操作,或者同时进行多个写入操作时,就会造成内存访问冲突。

根据编译器建议,可以拷贝给一个局部变量vmStat

也就是

var vmStat = vmStat1
        let status: kern_return_t = withUnsafeMutableBytes(of: &vmStat) {
            let boundPtr = $0.baseAddress?.bindMemory(to: Int32.self, capacity: MemoryLayout.size(ofValue: vmStat1) / MemoryLayout<Int32>.stride)
            return host_statistics(hostPort, HOST_VM_INFO, boundPtr, &host_size)
        }
        vmStat1 = vmStat

将这个局部变量的指针传进去做修改,修改完之后在将其值赋回给vmStat1

这样就不会同时对vmStat1进行读写操作导致内存冲突

withUnsafeMutableBytes这个方法中的注释中也有写到

WX20230331-093023_2x

body这个闭包持续时间中,也就是

{
            let boundPtr = $0.baseAddress?.bindMemory(to: Int32.self, capacity: MemoryLayout.size(ofValue: vmStat1) / MemoryLayout<Int32>.stride)
            return host_statistics(hostPort, HOST_VM_INFO, boundPtr, &host_size)
        }

这一段代码,是无法直接访问到value也就是上面的vmStat1变量的,只有在这个闭包return之后才能访问,所以将vmStat1拷贝到vmStatvalue现在是vmStat,在闭包中访问vmStat1就不会有内存访问冲突

标签:return,vmStat1,读写,IOS,host,let,内存,size,MemoryLayout
From: https://www.cnblogs.com/r1cardo/p/17289372.html

相关文章

  • IOS多线程之NSOperation(1)
    IOS多线程之NSOperation(1)NSOperation是OC语言中基于GCD的面向对象的封装;提供了一些用GCD不好实现的功能;线程的生命周期由系统自动管理。NSOperation需要和NSOperationQueue配合使用来实现多线程方案。单独使用NSOperation的话,它是属于同步操作,并不具备开......
  • iOS - 利用 UIBezierPath 绘制圆弧
    iOS-利用UIBezierPath绘制圆弧APIUIBezierPath绘制圆弧主要利用以下方法:openfuncaddArc(withCentercenter:CGPoint,radius:CGFloat,startAngle:CGFloat,endAngle:CGFloat,clockwise:Bool)方法中各参数含义:center:圆心radius:半径startAngle:开始弧度endAn......
  • IOS实现水波纹
    IOS实现水波纹需要实现一个水波纹效果其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动具体实现定义两个layer,用不同的颜色填充lazyvarfrontLayer:CAShapeLayer={lettempV=CAShap......
  • IOS颜色选择器
    IOS颜色选择器UIColorWellUIColorWell是一个继承UIControl的视图,它不能调整大小和UISwitch类似,大小大约是44*44。点击可弹出一个选择颜色的弹窗因为是继承UIControl所以可以添加UIControlEventValueChanged类型的Event事件去监听颜色改变///Setstheselectedcoloron......
  • linux 查看内存使用情况命令
    查看所有盘符的使用情况:df-h查看各个用户使用的存储空间大小:du-sh/home/*查看当前目录总共占的容量,而不单独列出各个子项占用的容量:du-sh查看当前目录下一级子文件和子目录所占用的磁盘容量:du-lh--max-depth=1统计当前文件夹|目录大小,并按文件大小排序:du-sh*|sort......
  • 黑马程序员高端iOS培训:苹果一条公告搅混了大家的脑洞
         正文前面,先说点正经的。苹果公司在北京时间8月30日凌晨正式向媒体发出邀请函,宣布将于北京时间9月8日凌晨1点在旧金山的比尔-格雷厄姆市政礼堂举行苹果秋季新品发布会。此次邀请函的主题为“Seeyouonthe7th”。     正经的说完了,不正经的要开始说了。或许是天......
  • 细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现
    1.前文回顾在之前的几篇内存管理系列文章中,笔者带大家从宏观角度完整地梳理了一遍Linux内存分配的整个链路,本文的主题依然是内存分配,这一次我们会从微观的角度来探秘一下Linux内核中用于零散小内存块分配的内存池——slab分配器。在本小节中,笔者还是按照以往的风格先带......
  • HDOJ1017 A Mathematical Curiosity
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1017这个题目其实挺坑的。首先是N,应该挺多人纠结过这个N,N其实是blocks(块),一块有未知个cases。一个块的结束标志是0,0。然后是PE的问题,空格、空行,我也是被坑的好惨。这里应该是每个块之间有一个空行!也就是说,最后一个块是不......
  • IOS获取蓝牙状态
    IOS获取蓝牙状态监听蓝牙状态在LinkBinariesWithLibraries中添加CoreBluetooto.framework创建CBCentralManager对象为了避免每次都获取蓝牙状态都弹窗,配置一下options将CBCentralManagerOptionShowPowerAlertKey设置为falseletoptions=[CBCentralManagerOptionShowPo......
  • OS-Windows-计算机内存型号配置查看
    OS-Windows-计算机内存型号配置查看近来想给计算机配置内存,在网上百度到了如何查看型号和配置的方法,整理如下。1.直接在计算机底部查看标识。2.win+R-->cmd-->systeminfo--->结果输出在当前窗口中。3.win+R-->cmd-->dxdiag--->弹出DirectX诊断工具窗口。4.cpu-zhttps......