博客
关于我
内存访问冲突
阅读量:731 次
发布时间:2019-03-21

本文共 1011 字,大约阅读时间需要 3 分钟。

Shaun的问题

我遇到了内存访问冲突的问题。这可能是在同一段内存被多个任务访问时发生的。问题又来自一个简单的例子:

var val = 10func plus(iVal: inout Int) {    iVal += val}plus(iVal: &val)print(val)

编译器报错说在访问val的时候出现了共享访问冲突。为什么呢?

我觉得这可能是因为在函数调用时,val这个变量被多个任务同时读取或者修改了。而iVal只是一个参数变量,理论上两个val其实指向同一个内存地址。

所以,这可能是因为“共享访问冲突”犯了一个常见的错误:如果两个任务尝试同时读取或修改同一个内存区域,尤其是写入操作,必须是互斥的。很多时候,共享访问冲突可以通过互斥锁或者其他机制来避免。

但同样,我看到另一个例子涉及元组类型的显示共享访问冲突:

func duce(_ long: inout Int , _ short: inout Int) {    let dif = long - short    long -= dif    short -= dif}func test() {    var tuple1 = (long:100, short:50)    duce(&tuple1.long, &tuple1.short)}test()

编译器报告说同一模块的多个任务访问同一个内存区域。这又是什么意思呢?我猜测这可能与内存管理模式有关。

我注意到,当我在全局区使用类似上面的代码时,会导致共享访问冲突。但当我将相同的代码写入局部变量时,它不再有问题了。这可能意味着全局区内存管理和栈区内存管理在某些方面是不一样的。

在全局区,可能会有更多的并发访问同一段内存,这需要更高层次的互斥控制。而在栈区,函数调用的上下文可能有助于避免这些问题。

这可能意味着,在全局区,连锁结构和互斥访问需要更谨慎地进行管理。或者,这可能和整块内存的可见性和访问方式有关。

总之,我需要进一步理解Swift内存管理的细节,尤其是在全局区和栈区之间如何处理内存的可见性和互斥访问。

如果知道更多的话,我可以更好地理解如何避免这些问题。

经过思考,我觉得这可能涉及到C指针类型的不可见性和栈内存分配的不同机制。

或许,全局区中的内存是共享的,而栈区的内存是独立分配的。

不过,具体的实现细节可能比较复杂,我需要进一步研究和实验才能得出结论。

转载地址:http://kprgz.baihongyu.com/

你可能感兴趣的文章
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos配置中心集群原理及源码分析
查看>>
nacos配置自动刷新源码解析
查看>>
Nacos集群搭建
查看>>
nacos集群搭建
查看>>
Navicat for MySQL 查看BLOB字段内容
查看>>
Neo4j电影关系图Cypher
查看>>
Neo4j的安装与使用
查看>>
Neo4j(2):环境搭建
查看>>
Neo私链
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
nestJS学习
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netbeans生成的maven工程没有web.xml文件 如何新建
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>