【发布时间】:2014-09-02 08:51:16
【问题描述】:
我有以下代码:
int attempts = 0;
while(ptr== NULL && attempts < 60) {
sleep(1000);
attempts++;
}
不断循环等待指针被另一个线程设置。另一个线程会简单地做
ptr = //some value
我的问题是,这安全吗?这是否会导致任何内存损坏,从而导致以后难以调试错误情况?
P.S:我知道由于缺少 volatile 关键字,编译器可能会优化 ptr。这对我来说并不重要。我只关心这是否会对代码的其他不相关部分造成问题。
【问题讨论】:
-
考虑使用原子操作,如本参考en.cppreference.com/w/c/atomic 中所述,它是在 C11 规范中引入的。
atomic_compare_exchange_strong是你循环中需要的。 -
看起来很安全,赋值操作是原子的。但是,这种方法并不明智,如果在 sleep() 中,ptr 被更改为某个值并再次变回 NULL 怎么办?
-
@someuser:它并不总是安全的。取决于处理器(及其与其他内核的缓存一致性机制)和对齐方式(某些处理器可以加载未对齐的数据,但这种加载不是原子的)。
-
@BasileStarynkevitch 我同意比较,可能会出错,但这怎么会导致崩溃?我不明白缓存一致性和对齐的意义
-
@jogabonito 考虑编译器是否优化
ptr与NULL的比较,方法是减少ptr,测试高位,然后增加ptr以恢复它。如果对ptr的更改介于这些操作之间,ptr将关闭 1 并且取消引用它可能会崩溃。
标签: c multithreading thread-safety