开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 361|回复: 9
收起左侧

[已解决] 有个思路不知是否可行,关于内存读写和全局变量的,欢迎讨论

 关闭 [复制链接]
结帖率:100% (15/15)
发表于 2025-5-11 22:36:39 | 显示全部楼层 |阅读模式   广东省广州市
20精币
多线程读写内存.e (1.04 MB, 下载次数: 0)

最佳答案

查看完整内容

这类问题,建议直接问大模型: https://chat.baidu.com/你从其他人那里获取的解答甚至不会比DeepSeek全面:

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

结帖率:100% (1/1)
发表于 2025-5-11 22:36:40 | 显示全部楼层   浙江省温州市
这类问题,建议直接问大模型:
https://chat.baidu.com/你从其他人那里获取的解答甚至不会比DeepSeek全面:

-1.png

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:100% (15/15)
 楼主| 发表于 2025-5-11 22:38:03 | 显示全部楼层   广东省广州市
多线程读写内存.e (1.04 MB, 下载次数: 2)
回复

使用道具 举报

结帖率:63% (22/35)

签到天数: 5 天

发表于 2025-5-11 22:58:25 | 显示全部楼层   广东省汕尾市
1.这样跟直接用文本型变量没什么区别,操作指针的意义在哪里
2.多线程同时读写一个内存地址,会崩溃
3.不应该在其他线程下操作界面也就是主线程,会崩溃
回复

使用道具 举报

签到天数: 6 天

发表于 2025-5-11 23:03:57 | 显示全部楼层   新疆维吾尔自治区*
启动线程时传了索引,那不如直接声明数组的全局变量,直接传下标,线程里根据下标读取全局变量
回复

使用道具 举报

结帖率:100% (15/15)
 楼主| 发表于 2025-5-11 23:24:43 | 显示全部楼层   广东省广州市
四叔 发表于 2025-5-11 22:58
1.这样跟直接用文本型变量没什么区别,操作指针的意义在哪里
2.多线程同时读写一个内存地址,会崩溃
3.不应该 ...

1,直接用会崩
2,一个线程写,其他线程读,不会崩(当然正常情况下肯定加锁或许可证更合理,因为不会崩所以没加)
3,多线程操作组件是容易崩溃的,易语言的编辑框不会,这里也主要是为了方便检查内存读取到的数据是否有异常
回复

使用道具 举报

结帖率:93% (93/100)

签到天数: 6 天

发表于 2025-5-12 01:16:12 | 显示全部楼层   广西壮族自治区南宁市
1.多线程读写全局变量时间长了一定会崩溃
2.我看到你多条线程同时操作同一个组件,这个也会崩
回复

使用道具 举报

结帖率:100% (15/15)
 楼主| 发表于 2025-5-12 09:20:27 | 显示全部楼层   广东省广州市
遗失的眼泪 发表于 2025-5-12 01:16
1.多线程读写全局变量时间长了一定会崩溃
2.我看到你多条线程同时操作同一个组件,这个也会崩 ...

其实算不上多线程读写全局变量,本质上是读写内存,全局变量只是内存指针
回复

使用道具 举报

结帖率:93% (93/100)

签到天数: 6 天

发表于 2025-5-12 11:21:21 | 显示全部楼层   广西壮族自治区南宁市
taba 发表于 2025-5-12 09:20
其实算不上多线程读写全局变量,本质上是读写内存,全局变量只是内存指针

这和是不是全局变量无关,只要你操作同一个目标不加锁,时间长了一定会出事
回复

使用道具 举报

结帖率:87% (39/45)

签到天数: 5 天

发表于 2025-5-12 23:18:55 | 显示全部楼层   河北省衡水市
  • 线程安全问题(最严重问题)

  • 存在典型的数据竞争(Data Race),当写入线程和读取线程同时访问同一内存区域时,会导致未定义行为
  • 可能引发内存访问冲突(Memory Access Violation)导致程序崩溃
  • 数据一致性无法保证,读取线程可能读取到不完整的中间状态数据

  • 内存可见性问题

  • 现代CPU的多级缓存架构可能导致写入数据不能及时同步到其他线程
  • 不同CPU核心的缓存不一致性会使读取线程看到过期的数据
  • 需要使用内存屏障(Memory Barrier)或原子操作保证可见性

  • 性能瓶颈

  • 多线程高频访问同一内存区域会导致缓存频繁失效(Cache Line Bouncing)
  • 可能产生严重的伪共享(False Sharing)问题,特别是当读写位置位于同一缓存行时
  • 建议将内存划分为多个缓存行对齐的区块(通常64字节)

  • 资源管理风险

  • 全局指针的生命周期管理需要特别注意,避免野指针
  • 没有同步机制可能导致读取线程访问未初始化完成的内存
  • 内存泄漏风险(需确保程序退出时正确释放)

  • 扩展性问题

  • 固定10MB内存可能无法适应未来需求变化
  • 缺乏流量控制机制,写入速度与读取速度不匹配时可能丢失数据
  • 没有错误处理机制(如内存访问失败处理)

[size=16.002px]

[size=16.002px]

[size=16.002px]改进建议方案
[size=16.002px]同步机制
[C++] 纯文本查看 复制代码
// 使用读写锁(C++17示例)
#include <shared_mutex>
std::shared_mutex rw_mutex;

// 写入线程
{
    std::unique_lock lock(rw_mutex);
    // 写操作
}

// 读取线程
{
    std::shared_lock lock(rw_mutex);
    // 读操作
}


内存优化
[C++] 纯文本查看 复制代码
// 缓存行对齐的结构
struct alignas(64) CacheLineAligned {
    char data[64];
};

无锁设计
[C++] 纯文本查看 复制代码
// 使用原子指针(C++11示例)
std::atomic<void*> global_ptr;

// 写入线程
void* new_ptr = allocate_memory();
global_ptr.store(new_ptr, std::memory_order_release);

// 读取线程
void* local_ptr = global_ptr.load(std::memory_order_acquire);

双缓冲方案
[C++] 纯文本查看 复制代码
// 双缓冲结构
struct DoubleBuffer {
    void* buffers[2];
    std::atomic<int> read_index = 0;
    std::mutex write_mutex;
    
    void* get_read_buffer() {
        return buffers[read_index.load(std::memory_order_acquire)];
    }
    
    void swap_buffers() {
        std::lock_guard lock(write_mutex);
        int new_index = 1 - read_index.load();
        // 更新写入缓冲
        read_index.store(new_index, std::memory_order_release);
    }
};


  • 监控指标

  • 添加读写计数器
  • 实现内存校验机制(如CRC校验)
  • 设置超时重试机制



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表