You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

共享内存中读取带锁变量是否安全?无锁getSth是否会触发段错误?

无锁读取结构体成员是否会导致段错误?

先看你给出的代码示例:

结构体定义:

struct sth {
    int abcd;
    pthread_mutex_t mutex;
};

对应的操作函数:

void setSth(int a) {
  lock(); // 推测是pthread_mutex_lock(&sth->mutex)
  sth->abcd = a;
  unlock(); // 对应pthread_mutex_unlock(&sth->mutex)
}

int getSth() {
  return sth->abcd;
}

你的问题是:sth变量永远不会被释放,不在getSth里加锁是否安全(此处的“安全”特指不会出现段错误,不在意读取结果的准确性)。


答案是:完全不会出现段错误,是安全的。

理由很直白:

  • 首先,sth的生命周期贯穿整个程序运行过程,不会被释放,意味着它的内存地址始终是合法有效的。你访问sth->abcd时,不会碰到“访问已释放内存”这种触发段错误的核心场景。
  • 其次,哪怕getSth和setSth同时执行——也就是读取abcd的同时有线程在写入它,这种情况下最多只会读到一个不准确的中间值(不过对于int这种基础类型,在大多数现代CPU架构上读写都是原子操作,但就算不是,也只是值不对而已),绝对不会触发段错误。段错误的本质是访问了非法内存,而这里的内存一直处于合法可用状态,所以根本不会出现崩溃问题。

总结一下:只要sth本身不会被销毁,不管你加不加锁读abcd,都不会出现段错误,最多是读到旧值或者半更新的值,这完全符合你“不在意准确性”的前提。


内容的提问来源于stack exchange,提问作者Sato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:15:17