共享内存中读取带锁变量是否安全?无锁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
相关产品推荐
相关产品推荐

