【发布时间】:2016-12-04 08:02:51
【问题描述】:
在 C 中确保当一个线程写入变量时另一个线程可以读取更新值的正确方法是什么?尽管搜索和“可能已经有你答案的问题”,但我没有找到任何答案,这给了我不是 C 的结果,而且有很多。
据我所知,C 没有涵盖它,所以我不得不依赖平台特定的调用,但我正在寻找跨平台可移植的东西。我知道我可以使用锁,但我认为这会产生一些不必要的开销,因为我确信一个线程只需要从变量中读取,而另一个线程只需要写入变量。我希望读取变量的线程在修改后立即知道。是否有正确的非平台特定方法来做到这一点?谢谢
【问题讨论】:
-
Volatile 应该足够了,如果不涉及其他变量的话。通常的问题是当涉及多个变量时,由于编译器和/或处理器优化,操作可能会乱序执行。
-
@rcgldr:我可能不会。将变量指定为 volatile 并不会阻止一个线程在变量被写入的那一刻读取它,这可能会导致意外的结果,如果不是臭名昭著的未定义行为的话。
-
@rcgldr 标准在哪里指定了“兼容类型”是什么,如果它们是兼容类型,它在哪里说 volatile 变量是原子的?
-
您至少需要 C11 才能获得可移植的方法。在标准(以草稿形式提供)中,您需要查看
,并且可能还需要查看 5.1.2.3 Program Execution 中的内存一致性模型规范。哦,而且 volatile 不起作用。
标签: c multithreading interlocked